C++如何不使用C++11的新特性来实现一个自动注册的工厂?

西行寺幽幽子 发布于 2016/04/12 15:12
阅读 400
收藏 0
c++

各位好,我想写一个类似于链接中的C++中实现自动注册的工厂的工厂模式,博客中使用了C++11标准的lambda表达式和std::function,因为工作中不能使用支持C++11标准的编译器,所以想请问一下各位,是否有办法不使用C++11新特性来实现一个类似的工厂?

PS:尝试使用过函数对象和函数指针来代替原文中的std::function,但是都会报参数类型不一致的错误


加载中
0
稀饭桶子
稀饭桶子

boost::function代替就可以了

给分吧

0
木兰宿莽
木兰宿莽
哈哈,C++中实现自动注册的工厂这几个字还有链接, 有原谅喔
0
newzai
newzai

http://my.oschina.net/cxh3905/blog/159122

使用virutal 方法来实现要具体执行的业务逻辑

0
西行寺幽幽子
西行寺幽幽子

引用来自“稀饭桶子”的评论

boost::function代替就可以了

给分吧

也不能使用boost库,自己试的好像都不行,回答的几个还是你比较靠谱,选为正确答案吧。。。
稀饭桶子
稀饭桶子
c++类成员函数的指针必须带上类名称的,所以你会编译不过。 如果要实现类工厂的话,如果你要实现的几个类拥有同一个父类, 应该可以通过工厂模式实现。
0
葛世超ChicoGe
葛世超ChicoGe
template <typename T, typename K=std::string>
class Factory
{
public:
	template <typename X>
	static void register_h(const K& key)
	{
		Factory::instance()->m_creators[key] = reinterpret_cast<void*(*)()>(&construct<X>);
	}

	static Factory<T>* instance()
	{
		static Factory<T> f;
		return &f;
	}

	T* create(const K& key)
	{
		T* re = NULL;
		auto ite = m_creators.find(key);
		if (ite != m_creators.end())
		{
			re = static_cast<T*>((ite->second)());
		}
		return re;
	}

	static T* product(const K& key)
	{
		return Factory::instance()->create(key);
	}

	template<typename Y>
	Y static * construct()
	{
		return new Y;
	}

	std::map<K, void*(*)()> m_creators;
};

//老兄你看这样改如何?



返回顶部
顶部