読者です 読者をやめる 読者になる 読者になる

fusion::map

C++

fusionのmapは、型をキーにして値を取り出す連想シーケンスです。


まず、fusion::mapの要素にはfusion::pairが使用されます。
fusion::pairはstd::pairと違い、値としてはsecondのみ保持します。

#include <iostream>
#include <boost/fusion/include/pair.hpp>

namespace fusion = boost::fusion;

int main()
{
    fusion::pair<int, char> p('X');
    std::cout << p << std::endl; // X

    std::cout << fusion::make_pair<int>('X') << std::endl; // X
}


次に、fusion::mapは以下のように使用します。

#include <iostream>
#include <string>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/at_key.hpp>

namespace fusion = boost::fusion;

int main()
{
    typedef fusion::map<
        fusion::pair<int, char>,
        fusion::pair<double, std::string>
    > map_type;

    map_type m(fusion::make_pair<int>('A'),
               fusion::make_pair<double>("Hello"));

    std::cout << fusion::at_key<int>(m)    << std::endl; // A
    std::cout << fusion::at_key<double>(m) << std::endl; // Hello
}

ここでは、intをキーとして'A'を、doubleをキーとして"Hello"を取り出す連想シーケンスを作成しています。
fusion::at_keyに型を指定して、引数としてfusion::mapのインスタンスを渡すと、値を取り出すことができます。



mapを構築する際の連続したmake_pairはとても長ったらしいので、
make_mapという、mapを生成するためのヘルパ関数も用意されています。

fusion::make_map<Key0,...KeyN-1>(Value0,...ValueN-1)

(まだ正確にドキュメンテーションされていないようです)

#include <iostream>
#include <string>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/make_map.hpp>
#include <boost/fusion/include/at_key.hpp>

namespace fusion = boost::fusion;

int main()
{
    typedef fusion::map<
        fusion::pair<int, char>,
        fusion::pair<double, std::string>
    > map_type;

    map_type m = fusion::make_map<int, double>('A', "Hello");

    std::cout << fusion::at_key<int>(m)    << std::endl; // A
    std::cout << fusion::at_key<double>(m) << std::endl; // Hello
}


さらに、C++0xのautoを使えばこれだけで済みます。
(GCC 4.4では使用可能です)

#include <iostream>
#include <string>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/make_map.hpp>
#include <boost/fusion/include/at_key.hpp>

namespace fusion = boost::fusion;

int main()
{
    auto m = fusion::make_map<int, double>('A', "Hello");

    std::cout << fusion::at_key<int>(m)    << std::endl; // A
    std::cout << fusion::at_key<double>(m) << std::endl; // Hello
}


boost::fusion::map

boost::fusion::pair

Associative Sequence(fusion::at_key)

BoostML - 【fusion】 problem with make_map