【问题标题】:C++: Converting template type char to std::string [duplicate]C ++:将模板类型char转换为std :: string [重复]
【发布时间】:2020-04-24 18:39:20
【问题描述】:

我是 C++ 模板的新手。我在将模板化成员对象转换为 std::string 时遇到问题。我下面的代码无法打印字符'c'(在我的机器上打印'R'),我找不到让它工作的方法。使用 char 作为类型 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;
}

【问题讨论】:

  • 你打算为T使用除char之外的其他类型吗?

标签: c++ string templates char type-conversion


【解决方案1】:

改变

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

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

在原版中,您将字符串文字视为指针。

【讨论】:

  • return std::string(1, static_cast&lt;char&gt;(t));
  • 谢谢,这有效,虽然我不太明白,为什么。你能解释一下区别吗?
  • @ga38xab 字符串字面量是一种普通的字符数组,当与算术一起使用时,它被视为一个指针。因此,表达式的结果是一些const char* 值增加了t 的整数值。结果指针无效,这会导致未定义的行为。您需要将运算符 + 应用于 std::string 对象而不是指针。编译器不会为您创建它,因此您需要手动执行此操作。
【解决方案2】:

如果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;
}

直播代码here.

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

【讨论】:

    【解决方案3】:

    问题

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 2012-10-31
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2013-12-21
      • 2014-07-13
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多