12
votes

Puis-je spécialiser un modèle de classe avec un modèle d'alias?

Voici un exemple simple: xxx

est-ce autorisé?


8 commentaires

Comment est-ce différent de Typef FOO bar; ?


@Kerreksb: C'est le contraire complet. Cela ressemblerait davantage à Typef Bar Foo ; (bien que cela ne soit pas autorisé). Dans mon exemple, bar existe déjà en tant que type, et foo devient un nouveau nom pour cela. (Ce que vous avez écrit équivalent à à l'aide de bar = foo ; , si cela aide.)


Oh je vois. Mais alors vous pourriez aussi bien demander que toute définition de classe à copier: classe foo = bar; etc. Je ne suppose pas que c'est possible ...


à l'aide de FOO = bar; ? (Ou Typef Bar FOO; si vous préférez l'ancien style.) Je ne m'attends pas à mon exemple (si valide) pour créer un type distinct (s'il vous plaît laissez-moi savoir que je vais savoir que je vous malends).


Hmm, lisant cette réponse: Stackoverflow.com/questions/6622452/... me fait croire que cela n'est pas possible.


Intéressant. Je pensais à Copier la définition de type, pas seulement en aliasant, puisque j'imagine que vous devriez fournir (l'équivalent de) une définition de classe complète pour une spécialisation explicite. La réponse liée suggère en effet que les alias ne sont pas le bon outil pour le travail.


J'ai écrit quelques définir S que généraliser sur la réponse d'Aotium, ici Stackoverflow.com/a/14050604/225186 < / a>


Il y a une manière légèrement indirecte. Voir Section 1.4


3 Réponses :


7
votes

Selon au §14.7.3 / 1 de la norme (également mentionné dans cet Autre réponse ), les alias ne sont pas autorisés comme spécialisations explicites: (

Une spécialisation explicite de l'un des éléments suivants:

  • Modèle de fonction
  • Modèle de classe
  • Fonction membre d'un modèle de classe
  • Membre de données statiques d'un modèle de classe
  • classe membre d'un modèle de classe
  • Modèle de classe membre d'une classe ou d'une classe de classe
  • Modèle de fonction membre d'une classe ou d'une classe de classe

    peut être déclaré [...]


0 commentaires

11
votes
$ clang++ -std=c++0x test.cpp
test.cpp:6:1: error: explicit specialization of alias templates is not permitted
template <>
^~~~~~~~~~~
1 error generated.
Reference: 14.1 [temp.decls]/p3:
  3 Because an alias-declaration cannot declare a template-id, it is not
  possible to partially or explicitly specialize an alias template.

1 commentaires

Est-ce que Clang 3.0? Ok, je vois des pages de clangs que mon clang 2.9 ne fonctionnera pas.



11
votes

Bien que la spécialisation directe de l'alias soit impossible, voici une solution de contournement. (Je sais que c'est un ancien poste mais c'est utile.)

Vous pouvez créer une structure de modèle avec un membre TECHEDEF et spécialiser la structure. Vous pouvez ensuite créer un alias qui fait référence au membre TypeDEF. P>

template <typename T>
struct remote
  { typedef T type; };

template <>
struct footype<float> :
  remote<bar> {};

foo<float> y; // y is a bar.


3 commentaires

J'utilise ce truc, mais cela aide à l'avoir ici. Donc, merci de la mettre en place. Et bienvenue à Stackoverflow!


Juste après avoir écrit une longue réponse avec la solution de contournement pour cette limitation, j'ai trouvé votre réponse qui utilise le même principe. En tout cas, j'ai écrit en plus un couple de définir s pour rendre le code plus court. Jetez un coup d'œil si vous êtes intéressé: Stackoverflow.com/a/14050604/225186


Je pense que vous avez manqué un dans le à l'aide de instruction: Modèle Utilisation de FOO = Typename Toodype :: Type;