5

认为:

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 初始化列表有帮助吗?

这类似于具有值列表的模板数组初始化,但它不构造具有递增值的元素。它稍后在运行时循环中设置它。

4

2 回答 2

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中的序列包生成器

于 2012-10-11T10:05:25.373 回答
2

假设某种索引解决方案可用:

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

这当然会导致额外的(移动)构造。

于 2012-10-11T09:55:56.847 回答