注意:所有这些都是不必要的,除非您向类添加了功能,因此它不再是聚合。(例如,其他构造函数、私有成员、基类等)修复问题中的代码的直接方法是删除构造函数。所以,让我们假设它还有更多内容。
我见过一些人试图做这样的事情。处理转换语义并尝试人为地重新创建通常函数调用的功能似乎很难看。
这是一种创建数组类的策略,它首先具有正确的构造函数。
模板别名会通过隐藏丑陋来锦上添花::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 );
}