#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;
}