我正在编写一个包装私有std::array
的容器存储类模板,以便为其添加一些功能。模板参数化值的数量,如下所示:
template<size_t N> class Vector {
private:
array<double, N> vals;
public:
[...]
};
我希望类的构造函数只接受N
双精度来填充数组,但我找不到一个好方法来做到这一点。变量论证不提供一种机制来检查它们中有多少,所以它们是正确的。参数包不进行浮点提升,但如果我只能弄清楚如何使用它们,我愿意处理它。
我尝试在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>
。如何摆脱模板中的这个流浪词?
答案 0 :(得分:5)
不要理解你的意思:
变量参数不提供检查有多少的机制 他们有,所以他们出去了
template <typename ...T>
Vector(T... args) {
static_assert(sizeof...(args) <= N, "oops");
}
应该工作..
答案 1 :(得分:2)
您还可以通过一些模板专业化技巧生成一个合适大小的包:
template <size_t N, class = std::make_index_sequence<N>>
class Vector;
template <size_t N, size_t... Is>
class Vector<N, std::index_sequence<Is...>>
{
private:
std::array<double, N> vals;
template <size_t >
using double_ = double;
public:
Vector(double_<Is>... vals)
{
...
}
};
这是一个非模板构造函数,需要N
double
s。
答案 2 :(得分:2)
通过关注Member function template with the number of parameters depending on an integral template parameter和Variadic templates with exactly n parameters,我们可以使用以下代码。
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} {}
};