Maison > développement back-end > C++ > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-10-25 07:36:29
original
685 Les gens l'ont consulté

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

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

<code class="cpp">void func() {
    Base2 val(1, 2);
}</code>
Copier après la connexion

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

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

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

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!