gpt4 book ai didi

c++ - 扩展 CRTP 模板功能

转载 作者:行者123 更新时间:2023-11-28 04:49:36 25 4
gpt4 key购买 nike

我对模板有点陌生,所以如果我问的是显而易见的问题,请多多包涵。

给定以下类层次结构:

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 .

所以我想在新类中使用方法 getInstance在 Singleton_T 和 createObject 中定义在 Pool_T 中定义适合我的新类型。

最初的方法是:

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

然而,这使得 GetInstanceSingleton_T实例化并返回 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 , createObjectloadObjectsFromFile .

然而,这迫使 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>;

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

有什么办法可以达到以下目的:

  • 保持Pool_T的原始定义
  • 创建一个扩展 Pool_T 功能的类(添加 loadObjectsFromFile 方法)
  • 类(class)有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>
{};

关于c++ - 扩展 CRTP 模板功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48501010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com