一个Curiously recurring template pattern (CRTP)的实现例子


#include 
#include 
#include 
#include 

class AbstractModule{
public:
    virtual void show() = 0;
};

class ConcreteModule1 : public AbstractModule {
public:
    void show() override { std::cout << "In ConcreteModule1 show()." << std::endl; }
    static AbstractModule * create() {
        std::cout << "In ConcreteModule1 create()." << std::endl;
        return new ConcreteModule1();
    }
};

class ConcreteModule2 : public AbstractModule {
public:
    void show() override { std::cout << "In ConcreteModule2 show()." << std::endl; }
    static AbstractModule * create() {
        std::cout << "In ConcreteModule2 create()." << std::endl;
        return new ConcreteModule2();
    }
};

class Factory {
public:
    static std::unordered_mapstring, std::function> m;
    static void registorModule(std::string modulename, std::function f) {
        m.insert(std::make_pair(modulename, f));
    }
    static AbstractModule * getModule(std::string moduename) {
        if(Factory::m.count(moduename)) { return (Factory::m.at(moduename))(); }
        return nullptr;
    }
};
std::unordered_mapstring, std::function> Factory::m;

#define REGISTOR(classname) Factory::registorModule(#classname, classname::create);

int main(int argc, char *argv[]) {
    REGISTOR(ConcreteModule1);
    REGISTOR(ConcreteModule2);
    AbstractModule * cm1 = Factory::getModule("ConcreteModule1");
    if(cm1) { cm1->show(); delete cm1; }
    AbstractModule * cm2 = Factory::getModule("ConcreteModule2");
    if(cm2) { cm2->show(); delete cm2; }
    AbstractModule * cm3 = Factory::getModule("ConcreteModule3");
    if(cm3) { cm3->show(); delete cm3; }
    return 1;
}