19template <
class T,
typename... Args>
21reset(
int, T & obj, Args... args) ->
decltype(obj.reset(args...), void())
23 obj.reset(std::forward<Args>(args)...);
26template <
class T,
typename... Args>
51 if (
auto _poolptr =
_pool.lock())
55 (*_poolptr.get())->
add(std::unique_ptr<T>{ptr});
62 std::default_delete<T>{}(ptr);
66 std::weak_ptr<SharedPool<T> *>
_pool;
70 typedef typename std::unique_ptr<T, ExternalDeleter>
PtrType;
75 void add(std::unique_ptr<T> t) {
_pool.push(std::move(t)); }
77 template <
typename... Args>
84 return PtrType(
new T(std::forward<Args>(args)...),
93 reset(1, *tmp, std::forward<Args>(args)...);
99 bool empty()
const {
return _pool.empty(); }
101 size_t size()
const {
return _pool.size(); }
107 std::stack<std::unique_ptr<T>>
_pool;
109 size_t _num_created = 0;
Originally From https://stackoverflow.com/a/27837534/2042320.
size_t num_created() const
PtrType acquire(Args &&... args)
void add(std::unique_ptr< T > t)
std::shared_ptr< SharedPool< T > * > _this_ptr
std::stack< std::unique_ptr< T > > _pool
std::unique_ptr< T, ExternalDeleter > PtrType
auto reset(int, T &obj, Args... args) -> decltype(obj.reset(args...), void())
ExternalDeleter(std::weak_ptr< SharedPool< T > * > pool)
std::weak_ptr< SharedPool< T > * > _pool