我对模板有点新意,所以如果我提出明显的问题请耐心等待。
给定以下类层次结构:
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中定义的方法getInstance
和createObject
中为我的新类型定制的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();
...
}
,getInstance
和createObject
。
然而,这迫使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>
然而,这将导致在我不是所有者的代码中分配查找和替换。
有没有办法实现以下目标:
struct someStruct;
class StructPool : public AlonePool_T<someStruct>;
方法)loadObjectsFromFile
和getInstance
方法(使用了正确的类型)修改
添加了三种方法以更好地强调所需效果。 鉴于liliscent的答案,我改变了层次结构,以更好地展示我所追求的目标。
答案 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>
{};