一个Dispatch table的例子


#include 
#include 
#include 

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

class ConcreteClass1 : public AbstractClass {
public:
    void show() { std::cout << "In ConcreteClass1 show()." << std::endl; }
};

class ConcreteClass2 : public AbstractClass {
public:
    void show() { std::cout << "In ConcreteClass2 show()." << std::endl; }
};

class ClassMap {
public:
    ClassMap() {
        std::shared_ptr cc1 = std::make_shared();
        std::shared_ptr cc2 = std::make_shared();
        cm["1"] = cc1;
        cm["2"] = cc2;
    }
    std::shared_ptr getConcreteClass(std::string classname) {
        if(cm.count(classname))
            return cm[classname];
        return nullptr;
    }
private:
    std::unordered_mapstring, std::shared_ptr> cm;
};

int main(int argc, char *argv[]) {
    ClassMap cm;
    std::shared_ptr ac = cm.getConcreteClass("1");
    if(ac) { ac->show(); }
    ac = cm.getConcreteClass("2");
    if(ac) { ac->show(); }
    ac = cm.getConcreteClass("3");
    if(ac) { ac->show(); }
    return 1;
}