我在写一个容器存储类模板,它封装了一个专用的std::array
以便为其添加一些功能。模板parametrises值的数量,具体如下:取决于整数模板的可变数量的构造函数参数
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
,但是我找不到任何有关为什么的文档),但是扩展结果参数包并没有' t似乎工作。我对参数包的其他担忧是,我不确定他们会确保所有参数的类型相同。
我试过在构造函数的主体中初始化列表的大小上运行一个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>
。我如何摆脱模板中的这个杂散术语?
为什么你的构造函数没有'array'参数?然后使用'Vector <3> {{1,2,3}}'。 –
Simple
为什么你想摆脱这个流浪的术语? – Holt
更改'Vector(T ... args){vals = {args ...}; }'to'Vector(T ... args):val {args ...} {}' –