gpt4 book ai didi

c++ - 选择模板参数不同的模板类构造器导致编译失败

转载 作者:行者123 更新时间:2023-11-30 05:13:47 26 4
gpt4 key购买 nike

这是一个最小的例子,假设我有一个 vector 类,其大小可以静态确定或动态确定。我允许构造函数使用不同的语法,如下例所示。

template<int RowAtCompileTime>
class Vector{
//Other Details
int rowNumber;
public:
//For vectors with size known at compile time
Vector(){
static_assert(RowAtCompileTime > 0,"Cannot do this");
rowNumber = RowAtCompileTime;
}
//For vectors with dynamic size
Vector(const int _rowNumber){
static_assert(RowAtCompileTime<=0, "Cannot do this");
rowNumber=_rowNumber;
}
};

template class Vector<0>;
template class Vector<1>;

int main(){
//do nothing
return 0;
}

根据语法,目标是这样的——只有一个构造函数应该是可调用的。假设模板参数 RowAtCompileTime 小于 0,这意味着它是动态的,只有构造函数 Vector(const int _rowNumber) 应该是可调用的。

代码不会在 std=c++11 下的 g++-4.8 下编译,这是预期的,因为构造函数将根据 this 实例化所有接口(interface)。 .从同一个网站看来,也不可能通过 SFINAE 通过它(但是,我对这个概念很陌生,我不确定这是否属实)。可以提供部分模板特化,但如果有很多参数,如 RowAtCompileTime,任务似乎非常艰巨。

最佳答案

SFINAE 是可能的;它只适用于函数模板,所以我们需要制作构造函数模板:

//For vectors with size known at compile time
template <int V = RowAtCompileTime, typename = std::enable_if_t<(V > 0)>>
Vector() {
rowNumber = V;
}
//For vectors with dynamic size
template <int V = RowAtCompileTime, typename = std::enable_if_t<(V <= 0)>>
Vector(const int _rowNumber) {
rowNumber = _rowNumber;
}

然后

Vector<0> v1(10);
Vector<1> v2;

顺便说一句:static_assert 在此实现中变得毫无意义,它们永远不会被触发。但是总是只有一个构造函数是可调用的,这取决于模板参数。调用不正确的构造函数会导致编译失败。

LIVE

关于c++ - 选择模板参数不同的模板类构造器导致编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com