2

次のコードを検討してください。

template<size_t head,size_t ... Dims> struct make_vec {
      typedef typename make_vec<Dims...>::type type[head];
};

template<size_t head> struct make_vec<head> {typedef float type[head];};

template<size_t ... Dims>
struct vec {
    typename make_vec<Dims...>::type _data;
};

クラスvecは集合体であるため、brace-enclosed-initializerリストを使用してを初期化できますvec

vec<3,3> foo = {{
    {1,2,3},
    {4,5,6},
    {7,8,9}
}};

コンストラクターをvecクラスに追加すると(たとえば、私の最終的な目標であるexpression-templateの使用を許可するため)、この構文はvec、集約ではなくなるため、許可されなくなります。

この場合、実行する論理的なことは、std::initializer_list;を使用することです。ただし、この構成を使用するコードをコンパイルすると、最適化を有効にしても長いアセンブリコードが得られます(std::uninitialized_copyinitializer_listからvecクラスデータメンバーにコピーするために使用します)。

同じ結果を達成するために可変個引数テンプレートを使用することはできませんでした。ユーザー定義の固定サイズのマルチアレイタイプを初期化するための最良の方法(つまり、優れたランタイムパフォーマンスと明確な構文)は何ですか?

4

1 に答える 1

3

コンストラクタを取ることができます

typename make_vec<Dims...>::type const&

これにより、ユーザー コードは、集約であるかのように同じスタイルの初期化を使用できます。GCC を使用している場合、GCC 4.7 などの最新バージョンが必要になる場合があります。

ただし、生成されたコードについてはわかりません。

于 2012-04-09T20:48:16.840 に答える