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 }
Associative Sequence(fusion::at_key)
BoostML - 【fusion】 problem with make_map