认为:
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<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<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中的序列包生成器
假设某种索引解决方案可用:
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>())) {}
这当然会导致额外的(移动)构造。