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

时间:2020-01-07 20:59:39

标签: c++ class templates initialization g++

我为模板类编写了默认的构造函数,该模板类将此处的所有值都标记为0。 我唯一的想法是检查 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> 是否为字符串类型,然后像对待字符串一样使用它。

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

但是出现以下错误:

错误:“ operator =”的模棱两可的重载(操作数类型为“ std :: __ cxx11 :: basic_string”和“ int”)

编辑: 类头看起来像这样:

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

1 个答案:

答案 0 :(得分:9)

您不需要知道类型,只需要使用更好的初始化程序即可。代替使用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。这更明确地表明您正在请求空指针,并且如果由于某种原因您的类型变为无指针也可以为您节省,因为它将导致编译器错误。