#include <iostream>
#include <vector>
#include <string>
#include <typeinfo>
#include <boost/mpl/list.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/key_type.hpp>
using namespace boost;
using namespace std;
struct Disp {
template <class Type>
void operator()(const Type&) const
{
cout << typeid(Type).name() << endl;
}
template <typename K, typename V>
void operator()(const mpl::pair<K,V>&) const {
cout << typeid(K).name() << "," << typeid(V).name() << endl;
}
} disp;
int main()
{
typedef mpl::list<int, std::string, char, std::vector<int> > tl;
typedef mpl::map<mpl::pair<int,char>, mpl::pair<int,int>, mpl::pair<char, char> > t2;
cout << "mpl list test" << endl;
mpl::for_each<tl>(disp);
cout << "mpl map test" << endl;
mpl::for_each<t2>(disp);
cout << "mpl map key_type test" << endl;
mpl::for_each<t2, mpl::lambda<mpl::key_type<t2, mpl::_1> > >(disp);
cout << "finish" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiNpbmNsdWRlIDxib29zdC9tcGwvbWFwLmhwcD4KI2luY2x1ZGUgPGJvb3N0L21wbC9mb3JfZWFjaC5ocHA+CiNpbmNsdWRlIDxib29zdC9tcGwva2V5X3R5cGUuaHBwPiAKCnVzaW5nIG5hbWVzcGFjZSBib29zdDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBEaXNwIHsKICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPgogICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFR5cGUmKSBjb25zdAogICAgewogICAgICAgIGNvdXQgPDwgdHlwZWlkKFR5cGUpLm5hbWUoKSA8PCBlbmRsOwogICAgfQogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CiAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgbXBsOjpwYWlyPEssVj4mKSBjb25zdCB7CiAgICAgICAgY291dCA8PCB0eXBlaWQoSykubmFtZSgpIDw8ICIsIiA8PCB0eXBlaWQoVikubmFtZSgpIDw8IGVuZGw7CiAgICB9Cn0gZGlzcDsKCgppbnQgbWFpbigpCnsKICAgIHR5cGVkZWYgbXBsOjpsaXN0PGludCwgc3RkOjpzdHJpbmcsIGNoYXIsIHN0ZDo6dmVjdG9yPGludD4gPiB0bDsKICAgIHR5cGVkZWYgbXBsOjptYXA8bXBsOjpwYWlyPGludCxjaGFyPiwgbXBsOjpwYWlyPGludCxpbnQ+LCBtcGw6OnBhaXI8Y2hhciwgY2hhcj4gPiB0MjsKCiAgICBjb3V0IDw8ICJtcGwgbGlzdCB0ZXN0IiA8PCBlbmRsOwogICAgbXBsOjpmb3JfZWFjaDx0bD4oZGlzcCk7CiAgICBjb3V0IDw8ICJtcGwgIG1hcCB0ZXN0IiA8PCBlbmRsOwogICAgbXBsOjpmb3JfZWFjaDx0Mj4oZGlzcCk7CiAgICBjb3V0IDw8ICJtcGwgIG1hcCBrZXlfdHlwZSB0ZXN0IiA8PCBlbmRsOwogICAgbXBsOjpmb3JfZWFjaDx0MiwgbXBsOjpsYW1iZGE8bXBsOjprZXlfdHlwZTx0MiwgbXBsOjpfMT4gPiA+KGRpc3ApOwogICAgY291dCA8PCAiZmluaXNoIiA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==