假设我有一个如下定义的模板化对象池类:
template<class T, size_t pool_size>
class Pool
{
public:
create(int index, *init parameters*)
{
pool_objects_[index].init(*init parameters*);
};
private:
std::array<T, pool_size> pool_objects_;
}
此对象池类实际上创建了一定数量的对象,然后允许其他人在池中“创建”对象实例。
我遇到的麻烦是创建方法。此方法的参数取决于实际的“池对象”类型。因此,我无法声明一个适用于每种Pool对象类型的函数。
例如,假设我有两种PoolObject类型,如下所示:
class Entity1;
class Entity2;
每个类实例都需要一组不同的参数来初始化对象。因此,对于我的通用Pool类,我需要create方法来接受取决于Pool对象类型的不同参数。
什么是实现这一目标的好方法?
我假设我可以创建另一个模板参数,该参数将允许用户定义“ InitObject”。 init对象本质上是一个包含初始化信息的结构。概述如下:
template<class T, class T_init, size_t pool_size>
class Pool
{
public:
create(int index, T_init init_obj)
{
pool_objects_[index].init(init_obj);
};
private:
std::array<T, pool_size> pool_objects_;
}
这似乎是一种合理的方法吗?还是看起来像模板黑客?我觉得不必指定T_init,因为我们已经指定了T,但是,我不确定是否有其他选择。
答案 0 :(得分:4)
您可以使create
为可变参数模板,该模板采用template parameter pack作为模板参数。例如
template <typename... U>
void create(int index, U&&... u)
{
pool_objects_[index].init(std::forward<U>(u)...);
};
然后,您可以将所有用于初始化的参数(在index
之后)传递到create
,稍后将它们转发到init
。