Considérez le code suivant:
struct A
{
// No data members
//...
};
template<typename T, size_t N>
struct B : A
{
T data[N];
}
Voici comment vous devez initialiser B: B<int, 3> b = { {}, {1, 2, 3} };
je veux éviter le {} vide inutile pour la classe de base. Il y a une solution proposée par Jarod42 ici , cependant, cela ne fonctionne pas avec l'initialisation par défaut des éléments: B<int, 3> b = {1, 2, 3};
c'est bien mais ce B<int, 3> b = {1};
n'est pas le cas: b.data[1]
et b.data[2]
ne sont pas initialisés par défaut à 0, et une erreur de compilation se produit. Existe-t-il un moyen (ou il y en aura avec c ++ 20) de "cacher" la classe de base à la construction?
c++
initialization
c++20
aggregate-initialization
user7769147
la source
la source
template<class... Ts> B(Ts... args) : data{args...} {}
?Réponses:
La solution la plus simple consiste à ajouter un constructeur variadique:
Si vous fournissez moins d'éléments dans la
{...}
liste d'initialisation queN
, les autres éléments du tableaudata
seront initialisés en tant que parT()
.la source
B<Class, 5> b = {Class()};
Class
qu'il sera construit en premier puis déplacé, alors qu'en utilisant l'initialisation agrégée,Class
il sera construit en place, aucun mouvement impliquéstd::tuple
des arguments et les utiliser pour construire des objets sur place. Mais la syntaxe sera plutôt lourde.Depuis C ++ 20, vous pouvez utiliser des initialiseurs désignés dans l'initialisation agrégée .
la source
Toujours avec le constructeur, vous pourriez faire quelque chose comme:
Démo
SFINAE est fait principalement pour éviter de créer un pseudo constructeur de copie
B(B&)
.Vous auriez besoin d'une balise privée supplémentaire pour prendre en charge
B<std::index_sequence<0, 1>, 42>
;-)la source
((void)Is, T())...
? Et si vous l'omettez simplement? Les éléments restants ne seront-ils pas initialisés avec uneT()
valeur par défaut?J'ai trouvé une autre solution qui (je ne sais pas comment) fonctionne parfaitement et résout le problème dont nous discutions sous la réponse d'Evg
la source
this->data
ouusing B_data::data;
accéder à l'data
intérieurB
.