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
701 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!

source:php.cn
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