C++ boostmpl递归元函数定义

C++ boostmpl递归元函数定义,c++,templates,boost,template-meta-programming,boost-mpl,C++,Templates,Boost,Template Meta Programming,Boost Mpl,我是MPL的初学者,所以我可能完全误解了如何使用它,但我已经尽了我所能让它发挥作用 首先,我要达到的目标。我有一大堆这样的课程: class X { typedef mpl::vector< D1,...,Dn > dependencies; ... } X类 { typedef mpl::vector依赖项; ... } 其中n可以是0(无依赖项),Di也是相同形式的类。我的目标是定义一个元函数 template < typename T > struct

我是MPL的初学者,所以我可能完全误解了如何使用它,但我已经尽了我所能让它发挥作用

首先,我要达到的目标。我有一大堆这样的课程:

class X
{
  typedef mpl::vector< D1,...,Dn > dependencies;
  ...
}
X类
{
typedef mpl::vector依赖项;
...
}
其中n可以是0(无依赖项),Di也是相同形式的类。我的目标是定义一个元函数

template < typename T >
struct unroll_dependencies
{
  typedef ??? type;
}
模板
结构展开依赖项
{
typedef???型;
}
这样,“类型”将是一个包含T及其所有(递归)依赖项的MPL序列,没有重复项,并确保序列中任何类始终位于其依赖项之后

到目前为止,我的尝试如下(到目前为止,我忽略了重复问题):

模板
结构展开依赖项
{
类型定义T;
typedef typename t::依赖项t_dep;
//对于T的每个依赖类Di,递归地展开其依赖项
typedef typename mpl::fold<
运输署署长,
向量0,
lambda<
复制<
typename展开依赖项<\u 2>::type,//
>
>
>::类型dep_类型;
//最后,在依赖项之后添加T本身
typedef typename mpl::push_back::type类型;
};
//类没有依赖项时的终止情况
模板
如果>::type>
{
//仅包含T的序列
typedefmpl::vector1type;
};
使用VC2012,我在标记行上得到一个编译器错误:

错误C2146:语法错误:缺少“,”在标识符“type”之前


我真的不太明白lambda和占位符是如何工作的,但我猜这与导致问题的递归定义的结合有关。谁能解释一下我犯这个错误的原因吗?我的解决方案是否完全错了?

您是否尝试了
boost::mpl::_2
template < typename T, typename Enable = void >
struct unroll_dependencies
{
  typedef T t;
  typedef typename t::dependencies t_dep;

  // For each dependency class Di of T, recursively unroll its dependencies
  typedef typename mpl::fold<
    t_dep,
    mpl::vector0<>,
    mpl::lambda<
      mpl::copy<
        typename unroll_dependencies< _2 >::type,  // <-- Compiler error here
        mpl::back_inserter< _1 >
      >
    >
  >::type dep_types;

  // Finally, add T itself after its dependencies
  typedef typename mpl::push_back< dep_types, t >::type type;
};

// Termination case for when a class has no dependencies
template < typename T >
struct unique_dependencies< T, typename boost::enable_if< mpl::empty< typename T::dependencies > >::type >
{
  // A sequence containing T alone
  typedef mpl::vector1< T > type;
};