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

标签 c++ templates recursion alias template-meta-programming

为什么编译失败:

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

最佳答案

What is the rationale for forbidding recursion in aliases if you can just replace it with more verbose construct?

你在那里回答了你自己的问题。你有做你想做的事情的机制。既然别名的定义只是某种事物的简写,为什么要使已经复杂的语法的语言复杂化呢?

您使用结构来实现机制,并使用别名来提供漂亮的类型名称:

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

短小精悍,语言语法更简单。

关于C++:为什么禁止递归模板化别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46595520/

相关文章:

c++ - 不能作为函数使用?

c++ - 应用 std::move 后对象实例会发生什么

c++ - Qt 5 中源代码外构建的链接器错误

c++ - 递归模板实例化在 dtor 中超出错误,但在 ctor 中没有。为什么?

java - 在 C++ 中使用模板检查继承

c++ - 尝试将 gz 文件提供给 C++ 程序

mysql层次结构自连接,检索所有子类别

linux - 在 Linux CLI 中以相对于当前目录的路径递归列出文件

python - 谁能告诉我这个函数的递归部分是如何工作的?

c++ - 模板组合和友元传递性