扩展CRTP模板功能

时间:2018-01-29 12:13:12

标签: c++ templates crtp

我对模板有点新意,所以如果我提出明显的问题请耐心等待。

给定以下类层次结构:

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

所以我想在新课程中使用Singleton_T中定义的方法getInstancecreateObject中为我的新类型定制的Pool_T

最初的方法是:

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

但是,这会使GetInstance的{​​{1}}实例化并返回Singleton_T类型,因此Pool_T<myStruct>方法无法通过loadObjectsFromFile获取(不会创建Manager类型的对象)。

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

getInstance

现在我可以使用以下三种方法:template< typename TDerrived, typename T> class Pool_T : public Singleton_T < TDerrived > { ... T* createObject(); ... } class Manager : public Pool_T<Manager, myStruct> { ... loadObjectsFromFile(); ... } getInstancecreateObject

然而,这迫使loadObjectsFromFile不再可能仅从1种类型实例化。

EG:

Pool_T

为了“解决”这个我定义了另一个模板:

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>

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

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

  • 维护Pool_T原始定义
  • 创建一个扩展Pool_T功能的类(添加 struct someStruct; class StructPool : public AlonePool_T<someStruct>; 方法)
  • 该类正确实施了loadObjectsFromFilegetInstance方法(使用了正确的类型)

修改

添加了三种方法以更好地强调所需效果。 鉴于liliscent的答案,我改变了层次结构,以更好地展示我所追求的目标。

1 个答案:

答案 0 :(得分:1)

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

template<class T>
struct Singleton {};

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

struct MyStruct {};

struct Manager 
    : public Pool<Manager, MyStruct>
{};