码迷,mamicode.com
首页 > 编程语言 > 详细

C++模板之类型与数据绑定

时间:2015-10-22 22:38:56      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:

有时候我们需要将类型与一些数据进行绑定,例如我们一般通过单例,将字符串与一个函数关联(一般称之为注册),之后通过字符串创建对象

class A {
public:
    static A* Create() { return new A(); }
}; 

然后像这样:

Instance::Register("A", A::Create);
A* a = Instance::Create("A");

用字符串进行绑定,不是很方便,如果字符串拼写错了,在整个编译期不会有任何提示,而且字符串是没有代码自动提示的,这样出错率大大增加了,当然你可以复制/粘贴;如果我们能够将一个类型与数据进行绑定,通过类型获取与之相关的数据,一是类型有代码自动提示的(一般拼写前几个字符就可以完成整个输入),及时你自己拼写出错了,没有定义这个类型,编译器编译时也会报错。

TypeBind.h

#ifndef _Type_Bind_H_
#define _Type_Bind_H_

#include <assert.h>
#include <map>

template<class _Value>
class TypeBind {
public:
    template<class _Type>
    void bind(_Value value) {
        m_map.insert(std::make_pair(TypeDefine<_Type>, value));
    }

    template<class _Type>
    _Value& find() {
        std::map<TypeDefineIndifiry, _Value>::iterator iter = m_map.find(TypeDefine<_Type>);
        assert(iter != m_map.end());
        return iter->second;
    }

private:
    template<class T>
    static void TypeDefine() {}
    typedef void(*TypeDefineIndifiry)();

    std::map<TypeDefineIndifiry, _Value> m_map;
};

#endif

test.cpp

#include "TypeBind.h"

typedef void*(*CreateCallback)(); // 创建函数的指针
class ObjectCreateFactory {
    public:
    /**   注册
    *    @T             绑定的类型
    *    @callback      对象创建函数
    */
    template<class T>
    void Register(CreateCallback callback) {
        m_map.bind<T>(callback);
    }
    /**   创建对象
    *    @T            创建对象的类型
    *    @return       创建的对象
    */
    template<class T>
    T* Create() {
        CreateCallback callback = m_map.find<T>();
        return (T*)callback();
    }

    static ObjectCreateFactory& Instance() {
        static ObjectCreateFactory* factory = nullptr;
        if (!factory)
            factory = new ObjectCreateFactory();
        return *factory;
    }
private:
    ObjectCreateFactory() {}
    TypeBind<CreateCallback> m_map;
};

class A {
public:
    static A* Create() { return new A(); }
};

class B {
public:
    static B* Create() { return new B(); }
};
// 注册
ObjectCreateFactory::Instance().Register<A>((CreateCallback)A::Create);
ObjectCreateFactory::Instance().Register<B>((CreateCallback)B::Create);
// 创建
A* a = ObjectCreateFactory::Instance().Create<A>();
B* b = ObjectCreateFactory::Instance().Create<B>();

 

C++模板之类型与数据绑定

标签:

原文地址:http://www.cnblogs.com/dongc/p/4903020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!