Subscribed unsubscribe Subscribe Subscribe

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 する方法はないものか。