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 :
<code class="cpp">using NewBase2 = Base<double, int>; void func() { constexpr NewBase2 val(1, 2); }</code>
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!