依赖于特定类类型的C++模板方法

C++ template methods that are dependent on specific class types?

本文关键字:C++ 模板方法 类型 依赖于      更新时间:2023-10-16

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

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_;
}

这个对象池类本质上创建了一定数量的对象,然后允许其他对象在池中"创建"对象实例。

我遇到的问题是create方法。此方法的参数取决于实际的池对象类型。因此,我不能声明一个适用于每个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,但是,我不确定有什么替代方案。

您可以使create成为可变模板,它以模板参数包作为模板参数。例如

template <typename... U>
void create(int index, U&&... u)
{
pool_objects_[index].init(std::forward<U>(u)...);
};

然后,您可以将初始化的所有参数(在index之后(传递给create,它们稍后将转发给init