2017-10-05 16 views
4

Pourquoi ce ne parvient pas à compiler:C++: Pourquoi l'alias modélisé récursif est-il interdit?

template<typename T, int N> 
using vec = vector<vec<T, N - 1>>; 
template<typename T> 
using vec<0> = T; 

tout simplement l'imbrication dans une struct fonctionne très bien:

template<typename T, int N> 
struct foo { 
    using vec = vector<typename foo<T, N - 1>::vec>; 
}; 
template<typename T> 
struct foo<T, 0> { 
    using vec = T; 
}; 

Quelle est la raison d'être interdit récursivité dans les alias si vous pouvez le remplacer par construit plus verbeux?

voir: https://godbolt.org/g/YtyhvL

+3

Vous ne pouvez pas spécialiser les alias de modèle, donc cela n'aurait pas fonctionné de toute façon. Mais encore une question intéressante. – HolyBlackCat

Répondre

2

Quelle est la raison d'être interdit récursivité dans les alias si vous pouvez simplement le remplacer par construction plus bavard?

Vous avez répondu à votre question là-bas. Vous avez le mécanisme pour faire ce que vous voulez. Et puisqu'un alias par définition est destiné à être juste un raccourci pour quelque chose, pourquoi compliquer les langues déjà compliquées grammaire?

Vous utilisez la structure à mettre en œuvre le mécanisme et un alias pour donner le joli nom du type:

template<typename T, int N> 
using vec = typename foo<T,N>::vec; 

court et doux, et avec une grammaire de langage plus simple.

+0

Merci, pour une raison quelconque, le fait d'utiliser l'alias modèle pour l'imbriqué ne m'est pas venu à l'esprit) Cependant, je ne vois pas comment cela compliquera la grammaire. Il y a déjà des alias de template. La syntaxe est là et elle est la même que pour les templates standards (donc les programmeurs y sont déjà habitués). Une chose à faire est d'ajouter une spécialisation et de permettre la récursivité, et il n'y aura pas besoin de hacks comme dans ce cas. –

+1

@DanM. - Pour qu'une caractéristique soit ajoutée à la norme, elle doit être démontrée comme utile. Un alias est évidemment utile. Une spécialisation d'alias ne l'est pas. Les alias n'ont pas été ajoutés pour prendre le relais des modèles de classe. De plus, leur utilisation beaucoup plus limitée rend leur vérification beaucoup plus simple. – StoryTeller

+0

@StorryTeller mais pourquoi introduire des templates alias alors? Par la même logique, vous pouvez simplement utiliser 'typename foo :: vec' à la place. –