将basic_string<unsigned char>转换为basic_string<char>,反之亦然

4

从以下内容中可以得知,将basic_string<unsigned char>转换为basic_string<char>(即std::string)是一种有效的操作。但我无法弄清楚如何做到这一点。

例如,哪些函数可以执行以下转换,填充这些假想stouutos函数的功能?

我能将unsigned char转换为char,反之亦然吗?

typedef basic_string<unsigned char> u_string;
int main() {
    string s = "dog";
    u_string u = stou(s);
    string t = utos(u);
}

我曾尝试使用reinterpret_caststatic_cast和一些其他的转换方式,但是我对它们的预期功能了解有限。


你需要哪种类型的转换? - Jonathan Potter
@JonathanPotter 以上代码中,任何能够在从st的转换过程中保留[A-Za-z0-9]字符的方法。 - Chris Redford
1
ustring u(s.begin(), s.end()); - Pete Becker
2个回答

6
假设您希望将原始内容中的每个字符复制并转换,那么解决方案就很简单了。
 u_string u(s.begin(), s.end());
 std:string t(u.begin(), u.end());

对于任何s内容,形成u是非常简单的,因为从signed charunsigned char的转换仅使用模算术即可。 因此,无论char实际上是signed还是unsigned都可以使用。

如果char实际上是signed charu中的任意一个字符具有超出signed char表示范围的值,则形成t将产生未定义行为。这是由于signed char的溢出引起的。 对于您特定的示例,一般不会发生未定义行为。


1
完整代码在这里。FWIW(顺便说一下),我正在检查Nicol的答案中是否需要static_cast - Tony Delroy

1

basic_string<T>转换成其他的basic_string<U>是不合法的,即使将T转换为U是合法的。这对于几乎所有模板类型都是正确的。

如果你想创建一个与原始字符串不同类型的新字符串副本,那很容易:

basic_string<unsigned char> str(
    static_cast<const unsigned char*>(char_string.c_str()),
    char_string.size());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接