次のコードを検討してください。
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_copy
initializer_listからvecクラスデータメンバーにコピーするために使用します)。
同じ結果を達成するために可変個引数テンプレートを使用することはできませんでした。ユーザー定義の固定サイズのマルチアレイタイプを初期化するための最良の方法(つまり、優れたランタイムパフォーマンスと明確な構文)は何ですか?