扩展 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
。
因此,我希望在新类中getInstance
Singleton_T中定义的方法,并在Pool_T
中定义createObject
为我的新类型量身定制的方法。
初始方法是:
struct myStruct;
class Manager : public Pool_T<myStruct>
{
...
void loadObjectsFromFile();
...
}
但是,这使得Singleton_T
的GetInstance
实例化并返回Pool_T<myStruct>
类型,因此loadObjectsFromFile
方法将无法通过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
。
但是,这迫使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
方法) - 该类具有正确实现
getInstance
和createObject
方法(使用正确的类型)
编辑:
添加了三种方法以更好地强调所需的效果。 给定的莉莉森特的答案 我改变了层次结构,以更好地显示我所追求的东西。
如果我正确理解您的问题,您的层次结构的典型 CRTP 实现是:
template<class T>
struct Singleton {};
template<class Derived, class T>
struct Pool
: public Singleton<Derived>
{};
struct MyStruct {};
struct Manager
: public Pool<Manager, MyStruct>
{};
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 具有特定于枚举的实现和共享功能 (CRTP) 的类模板
- 扩展 CRTP 模板功能
- 如何在python中实现CRTP功能
- CRTP可以完全取代小型设计的虚拟功能吗?