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

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

本文关键字:是否 变量 字符串 类型 何检查 检查      更新时间:2023-10-16

我为模板类编写了以下默认构造函数,它将此处的所有值签名为 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)

但是我收到以下错误:

错误:"运算符="的重载不明确(操作数类型为"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;
}
...

你不需要知道类型,你只需要使用更好的初始值设定项。 不要使用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] = {};
}

现在,您将获得一个T为任何类型的T初始化的值。

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

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

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


此外,虽然0是适当的空指针值,但应改用nullptr。 这更明确地传达了您正在请求空指针,如果由于某种原因您的类型变为没有指针,它也可以保存您,因为它会导致编译器错误。