53 votes

Pourquoi n'est-il pas possible de surcharger les modèles de classe?

La lecture de cette question m'a fait me demander: est-il une raison technique pour réfuter modèles de classe surcharges?

Par la surcharge, je veux dire d'avoir plusieurs modèles avec les mêmes noms, mais différents paramètres, par exemple

template <typename T>
struct Foo {};

template <typename T1, typename T2>
struct Foo {};

template <unsigned int N>
struct Foo {};

Le compilateur gère pour gérer les fonctions surchargées et les modèles de fonction, ne serait-il pas possible d'appliquer les mêmes techniques (par exemple, nom de mangling) pour les modèles de classe?

Au début, je pensais que peut-être que serait la cause d'une certaine ambiguïté des questions au moment de prendre le modèle de l'identificateur seul, mais la seule fois où cela peut notamment se produire lors du passage en tant que modèle argument de modèle, de sorte que le type du paramètre peut être utilisé pour choisir la surcharge:

template <template <typename> class T>
void A {};

template <template <unsigned int> class T>
void B {};

A<Foo> a; // resolves to Foo<T>
B<Foo> b; // resolves to Foo<N>

Pensez-vous que cette fonctionnalité pourrait être utile? Est-il un "bon" (c'est à dire technique) raisons pour lesquelles ce n'est pas possible dans le courant de C++?

40voto

TemplateRex Points 26447

L'article 12.5 de Modèles le Guide Complet (Amazon) contient cette citation:

Vous avez peut légitimement se demander pourquoi seuls les modèles de classe peut être partiellement spécialisées. Les raisons sont principalement historique. Il est probablement possible de définir le même mécanisme pour les modèles de fonction (voir Chapitre 13).

À certains égards, l' effet de surcharger les modèles de fonction est similaire, mais il y a aussi quelques différences subtiles. Ces différences sont la plupart liées au fait que le premier modèle a besoin d'être leva les yeux lorsqu'un usage est rencontré. Les spécialisations sont considéré seulement par la suite, de déterminer qui devrait être mise en œuvre utilisé.

En revanche, tous surchargés, les modèles de fonction doit être apporté dans une surcharge ensemble en regardant, et ils peuvent venir à partir de différents espaces de noms ou de classes. Cela augmente la probabilité de involontairement surcharge le nom d'un modèle un peu.

A l'inverse, il est également envisageable de permettre une forme de surcharge de modèles de classe. Voici un exemple:

// invalid overloading of class templates
template<typename T1, typename T2> class Pair; 
template<int N1, int N2> class Pair; 

Cependant, il ne semble pas être un besoin pressant d' un tel mécanisme.

En outre, la Conception et l'Évolution de C++ (Amazon) contient cette citation dans l'article 15.10.3

J'ai donc conclu que nous avions besoin d'un mécanisme pour "spécialisé modèles. Cela peut être fait soit par l'acceptation générale de la surcharge ou par certains plus de mécanisme spécifique. J'ai choisi un mécanisme spécifique parce que je pensais que j'ai été principalement aborder les irrégularités causées par irrégularités dans C et parce que des suggestions de surcharge invariablement crée un hurlement de protestation. J'ai essayé d'être prudent et de conservateur; je les considère aujourd'hui qu'une erreur. Spécialisation défini à l'origine a été restreinte et de l'anormal forme de surcharge équipée mal avec le reste de la langue.

En gras c'est moi qui souligne. Je interpréter cela en disant que la fonction de résolution de surcharge est plus difficile à mettre en œuvre (et obtenir le droit par les utilisateurs) de spécialisation de classe. Donc probablement pas de véritables obstacles techniques (de même pour le modèle de fonction partielle de la spécialisation), mais un accident historique.

22voto

log0 Points 6367

Vous ne pouvez pas "surcharger" le paramètre de type, l'argument non-type et le paramètre de modèle de modèle, mais vous pouvez spécialiser le modèle variadique:

 template <typename... T>
struct Foo;

template <typename T1>
struct Foo<T1> {};

template <typename T1, typename T2>
struct Foo<T1,T2> {};
 

-1voto

Science_Fiction Points 2051

Vous pouvez surcharger les modèles mais uniquement avec le nombre de paramètres transmis car ils gèrent déjà différents types de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X