Invocation explicite d'un constructeur de modèle en C
Invoquer explicitement un constructeur de modèle dans une liste d'initialisation peut être un défi en C . Malgré l'exemple fourni :
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
L'approche échoue car elle tente d'interpréter la syntaxe de manière incorrecte. Selon la norme C (14.8.1/7), « parce que la liste d'arguments de modèle explicite suit le nom du modèle de fonction et parce 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'y a aucun moyen de fournissez une liste d'arguments de modèle explicite pour ces modèles de fonctions."
Cela signifie qu'il n'est pas possible de transmettre directement les arguments de modèle aux constructeurs. Cependant, une solution de contournement existe :
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Dans ce cas, le type d'identité transmet effectivement l'argument du modèle au constructeur via un intermédiaire.
Alternativement, en C 20 et versions ultérieures, vous pouvez utilisez le type std::type_identity :
struct T { template<class U> T(std::type_identity<U>); }; struct U { U() : t(std::type_identity<void>()) {} T t; };
En utilisant ces solutions de contournement, vous pouvez initialiser efficacement les constructeurs de modèles explicitement dans listes d'initialiseurs, malgré les limitations imposées par le standard C.
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!