#include <iostream>
#include <typeinfo>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
template< typename T>
void X() {
cout<<typeid(T).name()<<endl;
}
struct A {
vector< function<void(void)> > callbacks;
void z() {
for( auto a : callbacks ) a();
}
template<typename T>
void M() {
callbacks.push_back( [](){ X<T>();} );
}
};
int main() {
A a;
a.M<int>();
a.M<double>();
a.M<string>();
a.z();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPCB0eXBlbmFtZSBUPgp2b2lkIFgoKSB7CiAgICBjb3V0PDx0eXBlaWQoVCkubmFtZSgpPDxlbmRsOwp9CgoKc3RydWN0IEEgewoKCnZlY3RvcjwgZnVuY3Rpb248dm9pZCh2b2lkKT4gPiBjYWxsYmFja3M7Cgp2b2lkIHooKSB7IAogICAgZm9yKCBhdXRvIGEgOiBjYWxsYmFja3MgKSBhKCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgTSgpIHsKICAgIGNhbGxiYWNrcy5wdXNoX2JhY2soIFtdKCl7IFg8VD4oKTt9ICk7Cn0KCn07CgppbnQgbWFpbigpIHsKICAgIEEgYTsKICAgIGEuTTxpbnQ+KCk7CiAgICBhLk08ZG91YmxlPigpOwogICAgYS5NPHN0cmluZz4oKTsKICAgIGEueigpOwogICAgcmV0dXJuIDA7Cn0=