取决于特定类类型的C ++模板方法?

时间:2018-07-13 01:34:10

标签: c++ templates initialization

假设我有一个如下定义的模板化对象池类:

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,但是,我不确定是否有其他选择。

1 个答案:

答案 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