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

Pourquoi la déduction d'arguments de modèle de classe partielle n'est-elle pas possible ?

Barbara Streisand
Libérer: 2024-11-09 01:02:01
original
783 Les gens l'ont consulté

Why is Partial Class Template Argument Deduction Not Possible?

Déduction d'arguments de modèle pour les modèles de classe : limites et implications

À la suite de la proposition P0091 visant à unifier le comportement de déduction d'arguments de modèle pour la fonction et modèles de classe, une question se pose : pourquoi la déduction partielle des arguments des modèles de classe n'est-elle pas possible ?

La proposition initiale visait à aligner les mécanismes de déduction, permettant une déduction partielle dans les deux contextes. Cependant, des inquiétudes ont émergé concernant une confusion potentielle lorsque les valeurs déduites produisent plusieurs spécialisations de modèles valides. Un exemple classique est la déduction d'un type de tuple : en spécifiant un seul argument, le compilateur pourrait déduire un tuple avec un seul élément, même si la définition originale du tuple inclut plusieurs éléments.

Pour éviter une telle ambiguïté, partielle La déduction des arguments du modèle de classe a été supprimée de la proposition. Cette limitation affecte les scénarios dans lesquels les développeurs peuvent souhaiter spécifier explicitement certains paramètres de modèle tout en laissant d'autres à déduire.

Par exemple, considérons le modèle de classe suivant :

template <std::size_t S, typename T>
struct test
{
    static constexpr auto size = S;
    using type_t = T;

    test(type_t (&amp;input)[size]) : data(input) {}
    type_t (&amp;data)[size]{};
};
Copier après la connexion

Une fonction d'assistance sert de un sucre syntaxique pour instancier des objets de test :

template <std::size_t S, typename T>
test<S, T> helper(T (&amp;input)[S]) { return input; }
Copier après la connexion

Lors de l'utilisation de l'assistant avec un tableau pré-déclaré :

int buffer[5];

auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer);      // Type deduced
auto c = helper(buffer);         // Type and size deduced
Copier après la connexion

La déduction partielle n'est pas prise en charge dans le cas des modèles de classe, car en témoigne l'échec de auto b = helper<5>(buffer);. Le compilateur ne peut pas déduire le paramètre T de l'argument, ce qui entraîne une erreur de compilation. Au lieu de cela, auto c = helper(buffer); déduit avec succès S et T, démontrant la nécessité de spécifier explicitement tous les paramètres du modèle.

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