#include <iostream>
#include<map>
#include<functional>
#include<forward_list>
#include<unordered_map>
using namespace std;
class BC
{
public:
virtual void print_ma() const{};
};
class A:public BC
{
public:
A(int a):m_a(a){};
void print_ma(void) const override
{std::cout<<m_a<<std::endl;};
private:
int m_a ;
};
class B:public BC
{
public:
B(int a):m_b(a){};
void print_ma()const override
{std::cout<<m_b<<std::endl;};
private:
int m_b ;
};
int main(int argc, char *argv[])
{
auto funA =[](int m){return ( A(m)).print_ma();};
map< std::string,function<void(int)>> mapFuncs;
mapFuncs.insert({"a", funA});
mapFuncs.insert({"b",[](int m){return B(m).print_ma();}});
mapFuncs.at("a")(22);
mapFuncs.at("b")(33);
auto Acon = [] (int m ){return (new A(m));};
map<std::string,function<BC*(int m)>> mapConstructors;
mapConstructors.insert({"A",Acon});
mapConstructors.insert({"B",[](int m){return new B(m);}});
mapConstructors.at("A")(333)->print_ma();
mapConstructors.at("B")(2222)->print_ma();
}