美文网首页
c++泛型的简单实现

c++泛型的简单实现

作者: 76577fe9b28b | 来源:发表于2017-05-05 17:30 被阅读41次
    一: 创建工厂类,存放创建对象的函数
    • 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;
    }
    
    

    相关文章

      网友评论

          本文标题:c++泛型的简单实现

          本文链接:https://www.haomeiwen.com/subject/qxjstxtx.html