Maison >développement back-end >C++ >## Pouvons-nous déduire partiellement les arguments des modèles pour les modèles de classe en C 17 ?

## Pouvons-nous déduire partiellement les arguments des modèles pour les modèles de classe en C 17 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 07:36:29759parcourir

## Can We Partially Deduce Template Arguments for Class Templates in C  17?

Déduction partielle des arguments de modèle de classe en C 17

La fonctionnalité C 17 « Déduction d'argument de modèle de classe » (CTAD) permet aux compilateurs de déduire automatiquement les arguments de modèle d'une classe lorsqu'elle est instanciée. Cela simplifie le code et élimine le besoin de spécifier des arguments de modèle explicites.

Cependant, pouvons-nous spécifier partiellement les arguments de modèle et laisser le reste être déduit ?

Tentative de solution 1 :

Une tentative de déduction partielle consiste à créer un modèle d'alias comme suit :

<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>

Utilisez ensuite l'alias pour spécifier partiellement les arguments :

<code class="cpp">void func() {
    Base2 val(1, 2);
}</code>

Cependant, cela entraînera une erreur de compilation, indiquant que l'utilisation d'un modèle d'alias nécessite une liste complète d'arguments de modèle.

Solutions de contournement :

Malheureusement, la déduction partielle n'est pas directement prise en charge dans C 17. Cependant, certaines solutions de contournement sont disponibles :

1. Fonctions d'aide à la surcharge :

Créez des fonctions de surcharge avec différents ensembles d'arguments spécifiés et utilisez la surcharge la plus spécifique pour la déduction :

<code class="cpp">template<class T, class U>
void func(Base<T, U> val) { }

template<class T>
void func(Base<T, double> val) { }

template<>
void func(Base<double> val) { }</code>

2. Déduction d'argument explicite :

Utilisez la déduction d'argument explicite de modèle pour spécifier des arguments spécifiques tout en déduisant les autres :

<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>

3. Utiliser des modèles variadiques :

Créez un modèle variadique qui accepte plusieurs arguments et peut déduire les arguments du modèle :

<code class="cpp">template<typename... Args>
class Base {
public:
    Base(Args&&... args) {
        // Custom logic to deduce template arguments from args...
    }
};</code>

Conclusion :

La déduction d'arguments de modèle de classe partielle n'est pas directement prise en charge dans C 17. Cependant, en utilisant des solutions de contournement telles que la surcharge de fonctions, la déduction explicite ou les modèles variadiques, il est possible d'obtenir un effet similaire.

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:
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