c++泛型的简单实现

2017-05-05  本文已影响41人  76577fe9b28b
一: 创建工厂类,存放创建对象的函数
#include <iostream>
#include <map>

typedef  void * (*createClass)();

class Factory {
    
private:
    std::map<std::string, createClass> map;
    Factory();
    
public:
    //获取单利对象  ,注意,这里不能返回拷贝对象,由于是单例
    static Factory & instanceFactory(){
        
        static Factory factory;
        return factory;
    }
    void setStringFun(std::string name, createClass fun);
    createClass getFunByClassName(std::string name);
};

#include "Factory.hpp"

Factory::Factory(){
    
    
}

void Factory::setStringFun(std::string name, createClass fun){
    
    this->map.insert(std::make_pair(name, fun));
    
}
createClass Factory::getFunByClassName(std::string name){
    
    std::map<std::string, createClass>::iterator f = map.find(name);
    
    if (f != map.end()) {

        return f->second;
    }
    return NULL;
}
二: 添加函数到工厂类
#include <iostream>

#include "Factory.hpp"
/*
    1.定义回调函数
    2. 执行类的构造函数,把要回调函数注册到工厂类中
*/
#define AddFun(className) \
className * tgy##className(){  \
return new className;       \
}\
AddFunFactory  ad##className(#className, (createClass)tgy##className);\

class AddFunFactory {

public:
    AddFunFactory(std::string className, createClass fun){
    
        Factory::instanceFactory().setStringFun(className, fun);
    };
};

三: 测试类
#include <iostream>

class MyClass {
    
public:
    
    void print();
};

void MyClass::print(){
    
    std::cout << "sad" << std::endl;
}
四:测试
#include <iostream>
#include "MyClass.hpp"
#include "AddFunFactory.hpp"


AddFun(MyClass);

int main(int argc, const char * argv[]) {
   
    createClass cc = Factory::instanceFactory().getFunByClassName("MyClass");
    
    MyClass *mc =(MyClass *) cc();
    mc->print();
    
    delete mc;
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读