如何检查模板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
。这更明确地表明您正在请求一个空指针,如果由于某种原因您的类型变为非指针,它也可以为您节省时间,因为它会导致编译器错误。
我已经为模板 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
。这更明确地表明您正在请求一个空指针,如果由于某种原因您的类型变为非指针,它也可以为您节省时间,因为它会导致编译器错误。