Maison > développement back-end > C++ > Comment puis-je appeler explicitement un constructeur de modèle dans une liste d'initialisation C ?

Comment puis-je appeler explicitement un constructeur de modèle dans une liste d'initialisation C ?

Mary-Kate Olsen
Libérer: 2024-12-03 04:56:12
original
543 Les gens l'ont consulté

How Can I Explicitly Invoke a Template Constructor in a C   Initializer List?

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

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

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

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!

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