En C, comment des constructeurs de modèles explicites peuvent-ils être invoqués lors de l'initialisation d'objets dans un constructeur de classe ? Prenons l'exemple suivant :
struct T { template<class> T(); }; struct U { U() : t<void>() {} // This approach does not work T t; };
Le code fourni tente d'invoquer explicitement le constructeur de modèle de T dans la liste d'initialisation de U. Cependant, cette approche échoue.
L'appel explicite de constructeurs de modèles dans les listes d'initialisation n'est pas pris en charge en C . Cette limitation provient du fait que les arguments du modèle sont généralement spécifiés après le nom du modèle de fonction à l'aide de crochets angulaires. Étant donné que les constructeurs n'ont pas leur propre nom, il n'existe aucun moyen conventionnel de leur transmettre des arguments de modèle.
Le standard C note explicitement cette limitation dans la section 14.8.1/7 :
[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
Une solution de contournement consiste à utiliser un type d'assistance pour transmettre l'argument du modèle en tant qu'argument à un constructeur qui accepte une identité de type. Par exemple :
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
Dans ce cas, le modèle d'identité défini dans Boost peut être utilisé pour envelopper l'argument du modèle. Alternativement, en C 20, le type std::type_identity peut être utilisé.
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!