是否可以根据整数模板参数构造成员数组的元素?

时间:2012-10-11 09:45:35

标签: c++ templates 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 array initialization with a list of values,但它不构造具有增加值的元素。它稍后在运行时循环中设置它。

2 个答案:

答案 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>())) {}

这当然会产生额外的(移动)结构。