Maison > développement back-end > C++ > Comment appeler explicitement des constructeurs de modèles dans les listes d'initialisation C ?

Comment appeler explicitement des constructeurs de modèles dans les listes d'initialisation C ?

Linda Hamilton
Libérer: 2024-11-27 08:28:10
original
728 Les gens l'ont consulté

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

Invocation explicite de constructeurs de modèles dans les listes d'initialisation

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;
};
Copier après la connexion

Énoncé du problème

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.

Réponse

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.

Explication

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. ]
Copier après la connexion

Solutions de contournement

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;
};
Copier après la connexion

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é.

Référence

  • [std::type_identity](https://en.cppreference.com/w /cpp/types/type_identity)

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal