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

## 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
Susan Sarandonoriginal
2024-10-25 07:23:02200parcourir

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

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>

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

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