依赖于特定类类型的C++模板方法
C++ template methods that are dependent on specific class types?
假设我有一个模板化的对象池类,定义如下:
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
。
相关文章:
- 将成员函数指针作为参数传递给模板方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- C++11:模板方法的模板函数调用无法编译?
- 如何从ECS中的模板方法获取组件?
- 使用 SFINAE 设计模板方法
- 一个模板方法,用于同时接受常量和非常量参数
- C++模板方法中的循环依赖关系
- 在 C++ 中使用模板方法重写类方法
- 类中的模板方法
- 基于枚举参数调用专用模板方法
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- 可变参数模板方法
- 使用模板方法为标头提供空 cpp 时出现问题
- SFINAE 方法在 clang 中完全禁用基类的模板方法
- 将函数和成员函数传递给模板方法
- 从非模板类调用专用模板方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 依赖于特定类类型的C++模板方法
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- 如何避免模板方法的循环依赖