C++ boostmpl递归元函数定义
我是MPL的初学者,所以我可能完全误解了如何使用它,但我已经尽了我所能让它发挥作用 首先,我要达到的目标。我有一大堆这样的课程: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
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;
};