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

## C 17 peut-il déduire partiellement des arguments de modèle dans la déduction d'arguments de modèle de classe (CTAD) ?

Susan Sarandon
Libérer: 2024-10-25 07:23:02
original
199 Les gens l'ont consulté

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

Déduction partielle d'arguments de modèle en C 17

La déduction d'arguments de modèle de classe (CTAD) a été introduite en C 17, permettant au compilateur de déduire automatiquement arguments de modèle basés sur les types d’arguments de fonction. Cependant, CTAD exige actuellement que tous les arguments du modèle soient déduits ou explicitement spécifiés. Est-il possible de spécifier partiellement les arguments du modèle et de laisser déduire les autres ?

Considérons l'exemple suivant :

<code class="cpp">template<class T, class U, class V>
struct Base {
  constexpr Base(T, U) {}
  constexpr Base(T, U, V) {}
  constexpr Base(V) {}
};

void func() {
  constexpr Base val(1, 4.0, false);
}</code>
Copier après la connexion

En utilisant CTAD, le compilateur déduira correctement que val a le type Base< ;int, double, booléen>. Cependant, que se passe-t-il si nous voulons spécifier partiellement les arguments du modèle, comme dans l'exemple suivant ?

<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool>
constexpr  Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>
Copier après la connexion

Malheureusement, ce code ne sera pas compilé, car le compilateur exige que tous les arguments du modèle soient déduits ou explicitement spécifiés. .

Solutions de contournement

Étant donné que la CTAD partielle n'est pas directement prise en charge, nous pouvons utiliser quelques solutions de contournement :

  • Créer des modèles d'alias pour combinaisons d'arguments spécifiques, comme le montre l'exemple suivant :
<code class="cpp">using NewBase2 = Base<double, int>;

void func() {
  constexpr NewBase2 val(1, 2);
}</code>
Copier après la connexion
  • Utilisez des techniques de métaprogrammation de modèles pour sélectionner conditionnellement le modèle approprié en fonction des arguments partiellement spécifiés.

Conclusion

La CTAD partielle n'est pas directement prise en charge dans C 17, mais il existe des solutions de contournement disponibles pour obtenir une fonctionnalité similaire. La prochaine norme C 20 devrait inclure la prise en charge de CTAD avec des modèles d'alias, mais elle n'inclut pas actuellement la prise en charge de CTAD partielle ou de CTAD avec des constructeurs hérités.

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!