如何检查模板类中的变量是否为字符串类型?
How to check if variable is of string type in template 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)
但是我收到以下错误:
错误:"运算符="的重载不明确(操作数类型为"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
。 这更明确地传达了您正在请求空指针,如果由于某种原因您的类型变为没有指针,它也可以保存您,因为它会导致编译器错误。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 在C++类中,是否必须初始化作为数组的成员变量
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 是否可以在C++中使变量真正只读
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 是否可以使用其他变量为变量分配值,而无需在 C++ 中更改其值?
- 如何检查变量是否是C++中的地图?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 在函数结束后使用指向变量的指针是否安全?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 是否值得对齐变量?
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 如何更好地检查两个 char 变量是否在一组值中?
- 模板变量是否允许在多个翻译单元中并有效合并?