繁体   English   中英

扩展CRTP模板功能

[英]Extending a CRTP template functionality

我对模板有点陌生,所以如果我要问明显的问题,请多多包涵。

给定以下类层次结构:

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

所以我想在新类中Pool_T针对我的新类型量身定制的getInstance定义的getInstance方法和Pool_T定义的createObject方法。

最初的方法是:

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

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

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

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方法(使用了正确的类型)

编辑:

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

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

template<class T>
struct Singleton {};

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

struct MyStruct {};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM