我是MPL的初学者,所以我可能完全误解了如何使用它,但我已经尝试了所有我能想到的让它发挥作用。
首先,我正在努力实现的目标。我有一堆形式的类:
class X
{
typedef mpl::vector< D1,...,Dn > dependencies;
...
}
其中n可以是0(无依赖性),Di也是相同形式的类。我的目标是定义一个元函数
template < typename T >
struct unroll_dependencies
{
typedef ??? type;
}
这样'type'将是一个包含T及其所有(递归)依赖关系的MPL序列,没有重复,并确保任何类总是在序列中的依赖之后出现。
到目前为止,我的尝试如下(到目前为止,我忽略了重复问题):
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;
};
使用VC2012,我在标记的行上出现编译错误:
错误C2146:语法错误:在标识符'type'
之前缺少','
我真的不太了解lambda和占位符是如何工作的,但我猜这与它与导致问题的递归定义的组合有关。任何人都可以解释我收到此错误的原因吗?我是否完全以错误的方式解决了这个问题?