扩展 CRTP 模板功能

Extending a CRTP template functionality

本文关键字:功能 CRTP 扩展      更新时间:2023-10-16

我对模板有点陌生,所以如果我问明显的问题,请耐心等待。

给定以下类层次结构:

template<typename T>
class Singleton_T
{
...
static T& getInstance(){ ... }
...
}

template<typename T>
class Pool_T: public Singleton_T<Pool_T<T> > 
{
...
T* createObject();
...
}

现在我想要一个扩展Pool_T功能的类,同时也是一个Singleton_T

因此,我希望在新类中getInstanceSingleton_T中定义的方法,并在Pool_T中定义createObject为我的新类型量身定制的方法。

初始方法是:

struct myStruct;
class Manager : public Pool_T<myStruct>
{
...
void loadObjectsFromFile();
...
}

但是,这使得Singleton_TGetInstance实例化并返回Pool_T<myStruct>类型,因此loadObjectsFromFile方法将无法通过getInstance使用(不会创建管理器类型的对象)。

为了解决这个问题,我在层次结构中进行了以下更改:

template< typename TDerrived, typename T>
class Pool_T : public Singleton_T < TDerrived >
{
...
T* createObject();
...
}
class Manager : public Pool_T<Manager, myStruct>
{
...
loadObjectsFromFile();
...
} 

现在我可以使用所有三种方法:getInstancecreateObjectloadObjectsFromFile

但是,这迫使Pool_T不再可能仅从 1 种类型实例化。

例如:

struct someStruct;
class StructPool : public Pool_T<someStruct>; // no longer possible 

为了"解决"这个问题,我定义了另一个模板:

template <typename T>
class AlonePool_T: public Pool_T<AlonePool_T<T>, T>
{
// empty class
// allows instantiation of what was previously Pool_T<someStruct>
}

现在我可以在以前定义Pool_T<someStruct>的地方使用它。

struct someStruct;
class StructPool : public AlonePool_T<someStruct>; 

但是,这将导致在我不是所有者的代码中分配查找和替换。

有没有办法实现以下目标:

  • 保持Pool_T原始定义
  • 创建一个扩展Pool_T功能的类(添加loadObjectsFromFile方法)
  • 该类具有正确实现getInstancecreateObject方法(使用正确的类型)

编辑:

添加了三种方法以更好地强调所需的效果。 给定的莉莉森特的答案 我改变了层次结构,以更好地显示我所追求的东西。

如果我正确理解您的问题,您的层次结构的典型 CRTP 实现是:

template<class T>
struct Singleton {};
template<class Derived, class T>
struct Pool
: public Singleton<Derived>
{};
struct MyStruct {};
struct Manager 
: public Pool<Manager, MyStruct>
{};