c++泛型的简单实现

一: 创建工厂类,存放创建对象的函数
  • 1: .h文件
#include 
#include 

typedef  void * (*createClass)();

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

  • 2 .cpp
#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::iterator f = map.find(name);
    
    if (f != map.end()) {

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

#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 

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

void MyClass::print(){
    
    std::cout << "sad" << std::endl;
}
四:测试
#include 
#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;
}

你可能感兴趣的:(c++泛型的简单实现)