kyu*_*oon 5 c++ templates boost boost-mpl
我需要一个支持类型递归的mpl :: equal like过程.
namespace mpl = boost::mpl;
BOOST_MPL_ASSERT(( mpl::equal<
mpl::vector<int, char>,
typename mpl::push_back<mpl::vector<int>, char>::type > )); // OK
Run Code Online (Sandbox Code Playgroud)
以上编译很好,但如果我在mpl :: transform或mpl :: fold中使用它,visual studio 2010 rc1会抱怨.
typedef mpl::vector<
mpl::vector<int, char>,
mpl::vector<char, char>> type_1;
typedef mpl::transform<
mpl::vector<
mpl::vector<int>,
mpl::vector<char>>,
mpl::push_back<mpl::_, char>>::type type_2;
BOOST_MPL_ASSERT(( mpl::equal<type_1, type_2> )); // FAILS
Run Code Online (Sandbox Code Playgroud)
但是,这些工作......
BOOST_MPL_ASSERT(( mpl::equal<
typename mpl::at_c<type_1, 0>::type,
typename mpl::at_c<type_2, 0>::type> )); // OK
BOOST_MPL_ASSERT(( mpl::equal<
typename mpl::at_c<type_1, 1>::type,
typename mpl::at_c<type_2, 1>::type> )); // OK
Run Code Online (Sandbox Code Playgroud)
是mpl :: equal不能用于动态生成的递归类型,还是我的语法有问题?
任何建议都会非常感激.
mpl::transformmpl::vector<>在你的情况下不会创建's 但mpl::vector2<>'s. 这些是不同的类型,即使它们在语义上是等效的。所以如果你写:
typedef mpl::vector2<
mpl::vector2<int, char>, mpl::vector2<char, char>
> type_1;
typedef mpl::transform<
mpl::vector<mpl::vector<int>, mpl::vector<char> >
, mpl::push_back<mpl::_, char>
>::type type_2;
BOOST_MPL_ASSERT(( mpl::equal<type_1, type_2> ));
Run Code Online (Sandbox Code Playgroud)
断言不会触发。