![](/img/trans.png)
[英]Class template with enum specific implementation and shared functionality (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_T
的GetInstance
实例化并返回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();
...
}
现在,我可以使用所有三种方法: getInstance
, createObject
和loadObjectsFromFile
。
但是,这迫使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>;
但是,这将导致分配并替换我不是所有者的代码。
有什么方法可以实现以下目的:
loadObjectsFromFile
方法) getInstance
和createObject
方法(使用了正确的类型) 编辑:
添加了三种方法来更好地强调所需的效果。 鉴于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.