对象池 c++11
2015-12-10 21:11
387 查看
#ifndef COBJECTPOOL_H #define COBJECTPOOL_H #include <functional> #include <memory> #include <map> #include <string> const int maxObjectNum = 10; template<class T> class ObjectPool { template<class ...Args> using Consturctor = std::function<std::shared_ptr<T>(Args...)>; public: template<class ... Args> void init(size_t num, Args && ... args) { if (num <= 0 || num > maxObjectNum) { throw std::logic_error("obj num out of range"); } auto constructName = typeid(Consturctor<Args...>).name(); for (size_t i = 0; i < num; i++) { m_obj_map.emplace(constructName, std::shared_ptr<T>(new T(std::forward<Args>(args)...), [this, constructName](T* p) { m_obj_map.emplace(std::move(constructName), std::shared_ptr<T>(p)); })); } } template<class ... Args> std::shared_ptr<T> Get() { auto constructName = typeid(Consturctor<Args...>).name(); auto range = m_obj_map.equal_range(constructName); for (auto it = range.first; it != range.second; ++it) { auto ptr = it->second; m_obj_map.erase(it); return ptr; } return nullptr; } private: std::multimap<std::string, std::shared_ptr<T>> m_obj_map; }; #endif//COBJECTPOOL_H
ObjectPool<int> pl; pl.init(2); auto t = pl.Get(); //t = 2; *(t.get()) = 2; std::cout << *(t.get()) << std::endl;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息