我相信这是最灵活的解决方案。这是基于特征 - 就像其他答案一样,但它使用起来非常简单。如果您需要更改建筑或销毁,请放置专门的功能。
我的建议:
template <typename T>
T* std_new() { return new T(); }
template <typename T>
void std_delete(T* p) { delete p; }
template <typename T, T*(*Create_)() = std_new<T>, void(*Destroy_)(T*) = std_delete<T> >
class Pool {
public:
T* create() { return Create_(); }
void destroy(T* p) { Destroy_(p); }
};
及其用法:
Pool<int> pi;
int* new_int_7() { return new int(7); }
Pool<int, new_int_7> pi7;
要保持阵列在池:
template <typename T, int N>
T* std_new_arr() { return new T[N](); }
template <typename T>
void std_delete_arr(T* p) { delete [] p; }
Pool<int, std_new_arr<int, 6>, std_delete_arr<int> > piarr;
如果使用一些标准集装箱但是考虑与专门的allocato r(如果需要)可能是最佳选择。