假设:
template<class T,int N>
struct A {
A(): /* here */ {}
T F[N];
};
我需要使用F[]
构建{0,1,2,...,N-1}
的元素。如果可能的话,我想避免递归定义的模板结构,将最后一个级别定义为template<class T> struct A<T,0>
并执行一些复杂的模板技巧。 C ++ 11初始化列表可以帮助吗?
这类似Template array initialization with a list of values,但它不构造具有增加值的元素。它稍后在运行时循环中设置它。
答案 0 :(得分:4)
您可以使用可变参数值模板和构造函数委派来执行此操作:
template<int... I> struct index {
template<int n> using append = index<I..., n>; };
template<int N> struct make_index { typedef typename
make_index<N - 1>::type::template append<N - 1> type; };
template<> struct make_index<0> { typedef index<> type; };
template<int N> using indexer = typename make_index<N>::type;
template<class T, int N>
struct A {
template<T...I> A(index<I...>): F{I...} {}
A(): A(indexer<N>{}) {}
T F[N];
};
这使用Calling a function for each variadic template argument and an array
中的序列包生成器答案 1 :(得分:2)
假设某种indices解决方案可用:
A(): A(make_indices<N>()) {}
// really a private constructor
template<int... Indices>
explicit A(indices<Indices...>)
// Can be an arbitrary expression or computation, too, like
// (Indices + 3)...
: F {{ Indices... }}
{}
如果你的编译器不支持委托构造函数,一个选项是切换到std::array<T, N>
并使用一个返回初始化数组的私有静态助手,这样默认的构造函数就会变成:
A(): F(helper(make_indices<N>())) {}
这当然会产生额外的(移动)结构。