【发布时间】:2015-09-04 16:38:48
【问题描述】:
我想在模板类构造函数中接受最多多个参数(这个数字在模板参数中定义)。我不能使用initializer_list,因为据我所知,我无法在编译时断言它的大小。
我尝试了什么
我的第一次尝试是使用 std::array 作为参数:
template<size_t s>
class foo {
int v[s];
public:
foo(std::array<int, s>) {/*...*/}
};
但是,这迫使我像这样初始化(即使构造函数不是explicit):
foo<4> a{{1,2,3,4}} // Two brackets.
我认为可能有一些模板魔法(可变参数模板?),但我什至无法弄清楚在构造函数中使用的正确语法。我不能递归调用构造函数...可以吗?
我尝试为std::array 寻找构造函数的定义(因为它不允许比数组大小更多的参数,这正是我想要的),但我能找到的只是它具有隐式构造函数.那是默认构造函数吗?如果是这样,如何
std::array<int, 3> a = {1,2,3}
工作?
可选奖励:为什么标准没有定义固定大小的替代std::initializer_list?像std::static_initializer_list<T, N> 这样的东西。未来是否有计划支持此类功能?还需要吗?
【问题讨论】:
-
为了澄清,你的意思是写
std::array<int, s>,对吧?我在任何地方都找不到n。同样std::array使用aggregate initialization -
你在我编辑修复它的那一刻让我:)谢谢你的链接!
-
用矢量怎么样?
-
你到底想要什么?你想要大小作为第一个参数吗?还是您希望它自动为您处理?如果你这样做,使用
std::vector和它的大小函数,我想。 -
当参数少于限制时你打算怎么做?我想知道一个带有默认参数的构造函数是否就足够了。
标签: c++ templates c++11 constructor