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>可能であれば、最後のレベルを as として定義し、いくつかの複雑なテンプレート トリックを実行して、再帰的に定義されたテンプレート構造体を避けたいと思います。C++11 イニシャライザ リストは役に立ちますか?

これは、値のリストを使用した Template 配列の初期化に似ていますが、値が増加する要素を構築しません。後で実行時ループで設定します。

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];
};

これは、各可変個引数テンプレート引数と配列の関数の呼び出しのシーケンス パック ジェネレーターを使用します。

于 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... }}
{}

コンパイラが委任コンストラクターをサポートしていない場合、1 つのオプションはstd::array<T, N>、デフォルトのコンストラクターが次のようになるように、初期化された配列を返すプライベート静的ヘルパーに切り替えて使用することです。

A(): F(helper(make_indices<N>())) {}

もちろん、これには追加の (移動) 構築が必要です。

于 2012-10-11T09:55:56.847 に答える