gpt4 book ai didi

c++ - 可变数量的构造函数参数取决于整数模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:48 27 4
gpt4 key购买 nike

我正在编写一个包装私有(private) std::array 的容器存储类模板为了给它添加一些功能。模板参数化值的数量,如下所示:

template<size_t N> class Vector {
private:
array<double, N> vals;
public:
[...]
};

我希望类的构造函数只接受 N double 来填充数组,但我找不到一个好的方法来做到这一点。 Variadic arguments 不提供一种机制来检查它们有多少,所以它们是正确的。参数包不进行浮点提升,但如果我只能弄清楚如何使用它们,我愿意处理它。

我已经尝试按照对 Member function template with the number of parameters depending on an integral template parameter 的回答中的方法进行操作但我不明白其中的意义enable_if<>::type=0部分。我已经尝试天真地复制该代码(尽管我更愿意了解它是如何工作的。我看到人们在其他地方使用 ::value 但我找不到任何关于为什么的文档)但是扩展了结果参数包似乎不起作用。我对参数包的另一个担忧是,我不确定它们是否会确保所有参数的类型都相同。

我试过运行 static_assert初始化列表的大小,在构造函数的主体中,但当然列表的大小在编译时不是常量,所以这也不起作用。

这里有标准方法吗?我只是使用了错误的参数包吗?


更新:我在上面链接的答案中得到了部分有效的方法:

template<size_t N> class Vector {
private:
array<double, N> vals;
public:
template <typename ...T,
typename enable_if<sizeof...(T) == N, int>::type = 0>
Vector(T ...args) {
vals = {args...};
}
};

现在的问题是 enable_if模板中的术语意味着当我初始化一个 Vector例如,

Vector<3> V {1.0, 2.0, 3.0};

它请求模板特化 Vector<3>::Vector<double, double, double, 0>而不是 <double, double, double> .我如何摆脱模板中的这个杂散术语?

最佳答案

不明白你的意思:

Variadic arguments don't provide a mechanism to check how many of them there are, so they're right out

template <typename ...T>
Vector(T... args) {
static_assert(sizeof...(args) <= N, "oops");
}

应该工作..

关于c++ - 可变数量的构造函数参数取决于整数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36131809/

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