#include <iostream>
#include <functional>
#include <map>
using namespace std;
enum E { A, B };
struct Some {
map<E,function<void()>> m;
Some ();
void process(E);
template <int N> void func();
};
template<> void Some::func<E::A>() {
cout << "A\n";
}
template<> void Some::func<E::B>() {
cout << "B\n";
}
Some::Some ()
: m (
{
{E::A, bind(&Some::func<E::A>, this)}
,{E::B, bind(&Some::func<E::B>, this)}
}
)
{
}
void Some::process(E x) {
m[x]();
}
int main() {
Some foo;
foo.process(E::A);
foo.process(E::B);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmVudW0gRSB7IEEsIEIgfTsKCnN0cnVjdCBTb21lIHsKICAgIG1hcDxFLGZ1bmN0aW9uPHZvaWQoKT4+IG07CgogICAgU29tZSAoKTsKICAgIHZvaWQgcHJvY2VzcyhFKTsKICAgIHRlbXBsYXRlIDxpbnQgTj4gdm9pZCBmdW5jKCk7Cn07Cgp0ZW1wbGF0ZTw+IHZvaWQgU29tZTo6ZnVuYzxFOjpBPigpIHsKICAgY291dCA8PCAiQVxuIjsKfQoKdGVtcGxhdGU8PiB2b2lkIFNvbWU6OmZ1bmM8RTo6Qj4oKSB7CiAgIGNvdXQgPDwgIkJcbiI7Cn0KClNvbWU6OlNvbWUgKCkKIDogbSAoCiAgICAgIHsKICAgICAgICAge0U6OkEsIGJpbmQoJlNvbWU6OmZ1bmM8RTo6QT4sIHRoaXMpfQogICAgICAgICx7RTo6QiwgYmluZCgmU29tZTo6ZnVuYzxFOjpCPiwgdGhpcyl9CiAgICAgIH0KICAgICApCnsKfQoKdm9pZCBTb21lOjpwcm9jZXNzKEUgeCkgewogICBtW3hdKCk7Cn0KIAppbnQgbWFpbigpIHsKCVNvbWUgZm9vOwogICAgZm9vLnByb2Nlc3MoRTo6QSk7CiAgICBmb28ucHJvY2VzcyhFOjpCKTsKfQ==