mpl::map に特化した mpl::find_if

特化というか、単に first で判断して、second を返すような処理が欲しかったので書いてみました。
久々にコーディングするので若干怪しい。

#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>

#include <boost/mpl/assert.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/find_if.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/value_type.hpp>

namespace mpl = boost::mpl;

template<typename Seq, typename Pred>
struct find_if_map :
    mpl::second<
        typename mpl::deref<
            typename mpl::find_if<
                Seq,
                mpl::apply1<
                    typename mpl::lambda<Pred>::type,
                    mpl::first<mpl::_1>
                >
            >::type
        >::type
    >
{};


typedef mpl::map<
    mpl::pair<int, char>,
    mpl::pair<char, float>,
    mpl::pair<float, int>
> seq;

BOOST_MPL_ASSERT(( boost::is_same<
    find_if_map<seq, boost::is_same<mpl::_1, char> >::type,
    float
//    mpl::at<seq, char>::type    // 単にキーの型で検索するならこっちでいい
> ));

int main(){}


ごちゃごちゃしていますが、やっている事はそんなに難しくありません。
mpl::find_if が Forward Iterator を返すのに対して、上の処理は直接 second を返しています。
んーまぁ特に気にしなくてもいいか……。


しかし、ちょっとコーディングしないだけで知識が吹っ飛んでいくぼんくらな頭をどうにかしたい。


[boost]
ver 1.45.0
[参照]
http://www.boost.org/doc/libs/1_45_0/libs/mpl/doc/refmanual/find-if.html