2016-01-06 24 views
3

从以下转换basic_string的<无符号字符>到basic_string的<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,和其他几个人,但我对他们的预期功能的知识是有限的。

+0

你想要什么类型的转换? –

+0

@JonathanPotter在上面的代码中,通过从's'到't'的转换可以保留'[A-Za-z0-9]'字符的任何东西。 –

+1

'ustring u(s.begin(),s.end());' –

回答

5

假设你想在原来的跨越复制每个字符转换,解决方案是简单

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

u形成是用于s任何内容直线前进中,由于转化率从signed charunsigned char简单地使用模运算。所以这将工作是否char实际上是signedunsigned

t形成将有不确定的操作如果char实际上是signed char和任何在u的单个字符的具有一个signed char可以表示范围以外的值。这是因为signed char的溢出。对于您的特定示例,通常不会发生未定义的行为。

+1

FWIW - 完整代码[here](http://coliru.stacked-crooked.com/a/a36d1718cb11f715)。 (我很理智,检查Nicol答案中的static_cast是不需要的。) –

1

这是不是一个合法的转换一个basic_string<T>到任何其他basic_string<U>,即使是合法的投TU。对于几乎所有的模板类型都是如此。

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

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