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

时间:2016-01-06 02:04:51

标签: c++ string casting unsigned-char

来自以下

Can I turn unsigned char into char and vice versa?

似乎将basic_string<unsigned char>转换为basic_string<char>(即std::string)是有效的操作。但我无法弄明白该怎么做。

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

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

我尝试使用reinterpret_caststatic_cast和其他一些人,但我对其预期功能的了解有限。

2 个答案:

答案 0 :(得分:5)

假设您希望复制原始文件中的每个字符并进行转换,解决方案很简单

 u_string u(s.begin(), s.end());
 std:string t(u.begin(), u.end());

u的任何内容都可以直接形成s,因为从signed char转换为unsigned char只是使用模运算。因此char实际上是signedunsigned

会有效

如果t实际为charsigned char中的任何单个字符的值超出范围{{1},则u的形成将具有未定义的行为可以代表。这是因为signed char的溢出。对于您的特定示例,通常不会发生未定义的行为。

答案 1 :(得分: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()); 投放到{{1}}是合法的。对于几乎所有模板类型都是如此。

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

{{1}}