如何检查模板类中的变量是否为字符串类型?

Myk*_*hyn 3 c++ templates initialization g++ class

我已经为模板类编写了以下默认构造函数,它将这里的所有值都标记为 0。我唯一的想法是检查它是否typename T是字符串类型,然后像使用字符串一样使用它。

vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
        for(size_t i = 0; i < _size; i++)
            values[i] = 0;
    }
Run Code Online (Sandbox Code Playgroud)

在 中main,我是这样使用的:

vec<int> t1; // default constructor works perfectly
vec<string> s2; // ambiguous overload here (signing string to int)
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

错误:“operator=”的重载不明确(操作数类型为“std::__cxx11::basic_string”和“int”)

编辑: 类头看起来像这样:

...
template<typename T>class vec{
    private:
    size_t _size;
    T * values;
    public:
    vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
        for(size_t i = 0; i < _size; i++)
            values[i] = 0;
    }

    ...
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 9

你不需要知道类型,你只需要使用更好的初始化程序。而不是 using 0, useT{}{}代替 like

vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]:0){
    for(size_t i = 0; i < _size; i++)
        values[i] = T{}; // or values[i] = {};
}
Run Code Online (Sandbox Code Playgroud)

现在你得到一个为任何类型初始化TT

您可以使代码更短,只需使用

vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]{} : 0) {}
Run Code Online (Sandbox Code Playgroud)

并将T[_size]{}为您值初始化整个数组。


此外, while0是一个合适的空指针值,您应该使用它nullptr。这更明确地传达了您正在请求一个空指针,并且如果由于某种原因您的类型变为没有指针,它也可以节省您,因为它会导致编译器错误。