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

Convert basic_string<unsigned char> to basic_string<char> and vice versa

来自以下

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 和其他几个,但我对它们的预期功能了解有限。

转换为 a 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());

假设你想把原文中的每个字符都复制过来转换,解决方法很简单

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

u 的形式对于 s 的任何内容都是直接的,因为从 signed charunsigned char 的转换仅使用模运算。所以不管 char 实际上是 signed 还是 unsigned.

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