C++ 转换基本字符串<;无符号字符>;到基本字符串<;char>;反之亦然

C++ 转换基本字符串<;无符号字符>;到基本字符串<;char>;反之亦然,c++,string,casting,unsigned-char,C++,String,Casting,Unsigned Char,从下面 似乎将basic_字符串转换为basic_字符串(即std::string)是有效的操作。但我不知道怎么做 例如,哪些函数可以执行以下转换,填充这些假设的stou和utos函数的功能 typedef basic_string<unsigned char> u_string; int main() { string s = "dog"; u_string u = stou(s); string t = utos(u); } typedef基本字符串u

从下面

似乎将
basic_字符串
转换为
basic_字符串
(即
std::string
)是有效的操作。但我不知道怎么做

例如,哪些函数可以执行以下转换,填充这些假设的
stou
utos
函数的功能

typedef basic_string<unsigned char> u_string;
int main() {
    string s = "dog";
    u_string u = stou(s);
    string t = utos(u);
}
typedef基本字符串u字符串;
int main(){
字符串s=“dog”;
u_字符串u=stou(s);
字符串t=utos(u);
}

我曾尝试使用
重新解释
静态
,以及其他一些方法,但我对其预期功能的了解有限。

基本
字符串转换为任何其他
基本
字符串并不是合法的转换,即使将
T
转换为
U
是合法的。几乎每种模板类型都是如此

如果要创建不同类型的原始字符串的副本,很容易:

basic_string<unsigned char> str(
    static_cast<const unsigned char*>(char_string.c_str()),
    char_string.size());
basic\u字符串str(
静态转换(char\u string.c\u str()),
char_string.size());

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

 u_string u(s.begin(), s.end());
 std:string t(u.begin(), u.end());
对于
s
的任何内容,
u
的形成都是直接的,因为从
有符号字符
无符号字符
的转换仅使用模运算。因此,无论
char
实际上是
signed
还是
unsigned
,这都会起作用


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

您想要什么类型的转换?@JonathanPotter通过上述代码中从
s
t
的转换来保留
[a-Za-z0-9]
字符的任何东西。
ustring u(s.begin(),s.end())FWIW-完整代码。(我正在检查是否不需要Nicol回答中的
static_cast