#include <iostream>
#include <map>
#include <string>

struct A {
        virtual ~A(){}
};

struct B : A
{
        B()
        {
                std::cout << "B constructed\n";
        }

        virtual ~B()
        {
                std::cout << "B destructed\n";
        }
};

struct C : A
{
        C()
        {
                std::cout << "C constructed\n";
        }

        virtual ~C()
        {
                std::cout << "C destructed\n";
        }
};

template <class T>
A* create()
{
        return new T;
}

typedef A*(*CreateFN)();


int main()
{
        std::map<std::string, CreateFN> classMap;
        classMap["B"] = &create<B>;
        classMap["C"] = &create<C>;

        delete classMap["B"]();
        delete classMap["C"]();
}
