我相信这是最灵活的解决方案。这是基于特征 - 就像其他答案一样,但它非常易于使用。如果您需要更改构造或破坏,只需放置您的专业功能。
我的建议:
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;
但是,请考虑使用带有专用分配器(如果需要)的标准容器是否是最佳选择。