为什么这个递归模板不起作用?

时间:2014-10-16 03:10:15

标签: c++ templates

所以我试图创建我认为是一个简单的递归模板来生成一个大而简单的嵌套类型:

#include <type_traits>
#include <typeinfo>

#include <boost/core/demangle.hpp>

template <typename T>
struct A {};

template <typename T, int N>
struct Nest
{
  using type = Nest<A<T>, N-1>
};

template <typename T>
struct Nest<T, 0>
{
  using type = T;
};

int main()
{
  typename Nest<A<int>, 20>::type x;
  std::cout << boost::core::demangle(typeid(x).name());
};

该程序的输出是

Nest<A<A<int> >, 19>

我希望看到嵌套在A<int>的19层中的A<>列表。这里发生了什么,我该怎么做才能得到我想要的效果?

2 个答案:

答案 0 :(得分:3)

忘记了递归步骤:

template <typename T, int N>
struct Nest
{
  using type = Nest<A<T>, N-1>::type
};

可能需要typename - 我现在无法访问编译器。

答案 1 :(得分:2)

这是最简单的递归方式:

template <typename T>
struct A {};

template <typename T, unsigned N>
struct Nest:Nest<A<T>,N-1> {};

如果您说流利的C ++,您可以将上述内容理解为“A Nest<T,N>Nest<A<T>,N-1>”。

然后我们添加例外:

template <typename T>
struct Nest<T, 0> {
  using type = T;
};

接下来,我们使用using别名来摆脱其他地方的typename垃圾邮件:

template <typename T, unsigned N>
using Nest_t = typename Nest<T,N>::type;

int main() {
  Nest_t<int, 20> x;
  std::cout << boost::core::demangle(typeid(x).name());
};