Boost.MPLのlambdaがようわからん
コンテナのリストが与えられたとき、そのすべての要素のvalue_typeが同じであるかどうかを調べるメタ関数を書いているんだけど、腑に落ちないのが以下。
#include <boost/mpl/vector.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/if.hpp> #include <boost/mpl/fold.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/and.hpp> #include <boost/mpl/lambda.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/type_traits.hpp> #include <vector> #include <list> typedef boost::mpl::vector<std::vector<int>, std::list<int> > type_list1; typedef boost::mpl::vector<std::vector<char>, std::list<int> > type_list2; template<typename Tlist_> struct whether_value_type_is_same { template<typename T_, typename Titem_> struct closure { typedef boost::mpl::and_< typename boost::is_same< typename Titem_::value_type, typename boost::mpl::at_c<Tlist_, 0>::type::value_type>, T_> type; }; }; // これはOK BOOST_MPL_ASSERT(( boost::mpl::fold<type_list1, boost::mpl::true_, boost::mpl::quote2<whether_value_type_is_same<type_list1>::closure> > )); BOOST_MPL_ASSERT(( boost::mpl::fold<type_list2, boost::mpl::true_, boost::mpl::quote2<whether_value_type_is_same<type_list2>::closure> > )); // これはNG (あたりまえだけど) BOOST_MPL_ASSERT(( boost::mpl::fold<type_list1, boost::mpl::true_, boost::mpl::and_< boost::is_same< boost::mpl::_1::value_type, boost::mpl::at_c<type_list1, 0>::type::value_type>, boost::mpl::_2> > ));
NGの方みたいにエレガントに placeholder から dereference する方法はないものか。