REMARQUE: Tout cela n'est pas nécessaire, sauf si vous avez ajouté des fonctionnalités à la classe, donc ce n'est plus un agrégat. (Par exemple, d'autres constructeurs, des membres privés, une classe de base, etc.) La manière immédiate de corriger le code dans la question est simplement de supprimer le constructeur. Alors, supposons qu'il y a quelque chose de plus.
J'ai vu des gens essayer de faire des choses comme ça. Il semble laid, traitant de la sémantique de conversion et essayant de recréer artificiellement la fonctionnalité d'un appel de fonction habituel.
Voici une stratégie pour créer une classe de tableau qui a simplement le bon constructeur en premier lieu.
L'aliasing de modèle mettrait la cerise sur le gâteau en cachant la laideur ::type
, mais ce n'est pas encore dans 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);
}
Pourquoi est-il un problème de jeter les valeurs? Si vous voulez faire attention au type de distribution, utilisez 'boost :: numeric_cast' et autorisez spécifiquement les conversions plus étroites. D'une façon ou d'une autre, vous réduisez ces arguments. – Potatoswatter
Si vous ne fournissez aucun constructeur, vous pourrez utiliser l'initialisation de l'accolade pour les agrégats. – sellibitze