C++:为什么禁止递归模板别名?

问题描述:

这是为什么失败编译:C++:为什么禁止递归模板别名?

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

而只是筑巢它变成一个结构非常有效:

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; 
}; 

什么是别名禁止递归,如果你可以将其替换为理更详细的结构?

看到:https://godbolt.org/g/YtyhvL

+3

你不能专门化模板别名,所以它不会工作。但仍然是一个有趣的问题。 – HolyBlackCat

什么是别名禁止递归,如果你能只是更详细的结构取代它的原理是什么?

你有点在那里回答你自己的问题。你有机制去做你想做的事情。而且,由于定义中的别名只是为了简化某些事情,为什么复杂的语言已经使语法复杂化了?

您可以使用结构来实现机械,别名给漂亮的类型名称:

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

简短而亲切,并用简单的语言语法。

+0

谢谢,由于某种原因,虽然使用模板化的别名为嵌套的一个没有发生在我身上) 但我不明白这将如何以任何主要方式复杂语法。已经有模板别名。语法在那里,它和常规模板一样(所以程序员已经习惯了)。剩下的一件事是添加一个专门化并允许递归,并且在这种情况下不需要任何黑客。 –

+1

@DanM。 - 对于要添加到标准中的功能,必须证明它是有用的。一个别名显然是有用的。别名专门化不是。没有添加别名来从类模板中接管。再加上他们更有限的使用,使他们的验证变得更加简单。 – StoryTeller

+0

@StorryTeller但为什么引入别名模板呢?按照相同的逻辑,你可以使用'typename foo :: vec'来代替。 –