Invocation explicite d'un constructeur de modèle en C
En C , il n'est pas possible d'invoquer explicitement un constructeur de modèle dans une liste d'initialisation. Cela est dû à la syntaxe spécifique utilisée pour les arguments du modèle, qui suivent le nom du modèle de fonction plutôt que d'être inclus entre parenthèses lors de la construction.
Comme indiqué dans la norme C (14.8.1/7) :
[Remarque : étant donné que la liste d'arguments de modèle explicite suit le nom du modèle de fonction et que les modèles de fonctions membres de conversion et les modèles de fonctions membres de constructeur sont appelés sans utiliser de nom de fonction, il n'existe aucun moyen de fournir un argument de modèle explicite. liste de ces modèles de fonctions. ]
Par conséquent, l'exemple suivant ne fonctionnera pas :
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
Dans ce cas, le compilateur tentera d'interpréter t
Solution de contournement
Pour contourner cette limitation, on peut utiliser un modèle de fonction qui prend un type d'identité comme argument :
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Étant donné la définition suivante de l'identité de Boost :
template<typename T> struct identity { typedef T type; };
ou, en C 20, en utilisant std::type_identity:
using ::std::type_identity;
cette approche permet effectivement de transmettre des arguments de modèle aux constructeurs dans les listes d'initialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!