注:クラスに機能を追加して集約されていない場合を除いて、これはすべて不要です。(たとえば、他のコンストラクター、プライベートメンバー、基本クラスなど)問題のコードを修正する直接の方法は、コンストラクターを削除することです。それで、それにもっと何かがあると仮定しましょう。
私は何人かの人々がこのようなことをしようとしているのを見ました。変換セマンティクスを処理し、通常の関数呼び出しの機能を人為的に再作成しようとすると、醜いように見えます。
これは、そもそも適切なコンストラクターを持つ配列クラスを作成するための戦略です。
テンプレートエイリアシングは醜さを隠すことでケーキにアイシングをかけます::type
が、それはまだGCCにはありません。
template< typename ... NT >
struct var_ctor_array {
enum { size_e = 0 }; // only used for zero size case
};
template< typename T, typename ... NT >
struct var_ctor_array< T, NT ... > {
enum { size_e = 1 + sizeof...( NT ) };
T st[ size_e ];
var_ctor_array( T elem0, NT ... elemN )
: st { elem0, elemN ... } {}
};
template< typename T, size_t N, typename ... NT >
struct gen_var_ctor_array {
typedef typename gen_var_ctor_array< T, N-1, T, NT ... >::type type;
};
template< typename T, typename ... NT >
struct gen_var_ctor_array< T, 0, NT ... > {
typedef var_ctor_array< NT ... > type;
};
int main() { // usage
gen_var_ctor_array< char, 5 >::type five( 1, 2, 3, 4, 5 );
}