C++:将模板类型 char 转换为 std::string

C++: Converting template type char to std::string

本文关键字:转换 string char std 类型 C++      更新时间:2023-10-16

我是 c++ 模板的新手。我在将模板化成员对象转换为 std::string 时遇到问题。我下面的代码无法打印字符"c"(在我的机器上它打印"R"代替(,我找不到使其工作的方法。使用字符作为类型 T 时有没有办法做到这一点?

#include <iostream>
#include <string>
template<class T>
class A {
public:
T t;
A(T t1):t{t1}{};
std::string toString(){
return "" + static_cast<char>(t); 
};
};

using namespace std;
int main()
{
A<char> a{'c'};
cout << a.toString() <<"n";
return 0;
}

问题

return "" + static_cast<char>(t);

""不是一个std::string对象,它是一个文字字符串,它是一个常量字符数组。作为一个数组,它将衰减到指向其第一个元素的指针,然后static_cast<char>(t)添加到指针中。

然后,此新指针将用作以 null 结尾的字符串来创建std::string对象,并且使用无效指针会导致未定义的行为

您可以直接从单个字符构造std::string并将其返回为

return std::string(1, static_cast<char>(t)); 

更改

return "" + static_cast<char>(t); 

return std::string() + static_cast<char>(t); 

对于原始文本,您将有一个被视为指针的字符串文本。

如果std::string可以从T构造,则可以使用以下解决方案:

#include <iostream>
#include <string>
template<class T>
class A {
public:
T t;
A(T t1):t{t1}{};
std::string toString(){
return {t}; // <- this constructs a string from t
};
};

using namespace std;
int main()
{
A<char> a{'c'};
cout << a.toString() <<"n";
return 0;
}

实时代码在这里。

但是,如果std::string无法从T构造,这将失败。在这种情况下,您可以使用模板专用化来正确处理转换。