c++递归 mpl::equal 问题?
我需要一个 mpl::equal 类似的过程来支持类型递归。
namespace mpl = boost::mpl;
BOOST_MPL_ASSERT(( mpl::equal<
mpl::vector<int, char>,
typename mpl::push_back<mpl::vector<int>, char>::type > )); // OK
上面的编译很好,但是如果我在 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
但是,这些工作...
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
是 mpl::equal 不适用于动态生成的递归类型,还是我的语法有问题?
任何建议将不胜感激。
i need an mpl::equal like procedure that supports recursion on types.
namespace mpl = boost::mpl;
BOOST_MPL_ASSERT(( mpl::equal<
mpl::vector<int, char>,
typename mpl::push_back<mpl::vector<int>, char>::type > )); // OK
the above compiles fine, however if i use it in mpl::transform or mpl::fold, visual studio 2010 rc1 complains.
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
however, these work...
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
is it that mpl::equal does not work on dynamically generated recursive types, or is there something wrong with my syntax?
any advice would greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
mpl::transform
在您的情况下不会创建mpl::vector<>
,但会创建mpl::vector2<>
' s。这些是不同的类型,即使它们在语义上是等效的。因此,如果你写:断言将不会触发。
mpl::transform
doesn't creatempl::vector<>
's in your case butmpl::vector2<>
's. These are different types, even if they are semantically equivalent. So if you write:the assert will not fire.