【问题标题】:C++: Why is the recursive templated alias forbidden?C++:为什么禁止递归模板化别名?
【发布时间】:2017-10-05 22:10:20
【问题描述】:

为什么编译失败:

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

【问题讨论】:

  • 你不能专门化模板别名,所以它无论如何也行不通。但仍然是一个有趣的问题。

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


【解决方案1】:

如果您可以用更详细的结构替换它,那么禁止别名中的递归的基本原理是什么?

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

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

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

短而甜美,语言语法更简单。

【讨论】:

  • 谢谢,由于某种原因,我没有想到为嵌套别名使用模板化别名)不过,我不明白这会以任何主要方式使语法复杂化。已经有模板别名。语法就在那里,并且与常规模板相同(因此程序员已经习惯了)。剩下的一件事是添加专业化并允许递归,并且不需要像这种情况下那样的黑客攻击。
  • @DanM。 - 对于要添加到标准中的功能,必须证明它是有用的。别名显然很有用。别名专业化不是。没有添加别名来接管类模板。再加上它们更有限的使用使它们的验证变得更加简单。
  • @StorryTeller 但是为什么要引入别名模板呢?按照同样的逻辑,你可以改用typename foo&lt;T, N&gt;::vec
  • @DanM。 - 不完全一样的逻辑。 Properly using the typename and template keywords is less than easy to remember。元编程库编写要么必须按原样提供他们的库,用户依赖于详细的语法,要么提供宏。但是宏是不好的,因为它不尊重范围或类型系统。别名的边际利润是值得的,因为它比上面的要好。但是一旦你开始复制专业化规则,就不值得了
猜你喜欢
  • 1970-01-01
  • 2013-10-28
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2017-09-02
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多