c++泛型的简单实现
2017-05-05 本文已影响41人
76577fe9b28b
一: 创建工厂类,存放创建对象的函数
- 1: .h文件
#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);
};
- 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<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;
}