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

问题描述 投票:2回答:1

我已经为模板类编写了默认的构造方法,该方法将此处的所有值都标记为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)

但是我得到以下错误

错误:'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;
    }

    ...
c++ class templates initialization g++
1个回答
5
投票

您不需要知道类型,只需要使用更好的初始化程序即可。不要使用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]{}将为您初始化整个数组的值。

© www.soinside.com 2019 - 2024. All rights reserved.