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

How to check if variable is of string type in template class?

我已经为模板 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;
    }

main中,我是这样使用的:

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

但我收到以下错误:

error: ambiguous overload for 'operator=' (operand types are 'std::__cxx11::basic_string' and 'int')

编辑: class header 看起来像这样:

...
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;
    }

    ...

你不需要知道类型,你只需要使用更好的初始化器。不要使用 0,而是使用 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] = T{}; // or values[i] = {};
}

现在你得到一个 value initialized T 任何类型 T.

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

vec(const size_t size_ = 0): _size(size_), values(_size? new T[_size]{} : 0) {}

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


此外,虽然 0 是一个合适的空指针值,但您应该改用 nullptr。这更明确地表明您正在请求一个空指针,如果由于某种原因您的类型变为非指针,它也可以为您节省时间,因为它会导致编译器错误。