CRTP模板功能扩展:继承单例池类并保留原有接口
关于C++模板单例与类扩展的问题
我刚接触C++模板,要是问题比较基础还请多多包涵😅。目前我有这么一套类层级结构:
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的功能,比如新增loadObjectsFromFile方法 - 同时保留
Singleton_T的单例特性 - 这个类能正确调用
Singleton_T的getInstance方法、Pool_T的createObject方法
最初的尝试问题
我一开始是这么写的:
struct myStruct; class Manager : public Pool_T<myStruct> { // ... void loadObjectsFromFile(); // ... }
但这里的问题是,Singleton_T的getInstance会实例化并返回Pool_T<myStruct>类型,没法通过getInstance调用我新增的loadObjectsFromFile方法。
修改后的层级,但破坏了原有用法
后来我调整了类的层级:
template< typename TDerived, typename T> class Pool_T : public Singleton_T < TDerived > { // ... T* createObject(); // ... } class Manager : public Pool_T<Manager, myStruct> { // ... void loadObjectsFromFile(); // ... }
这下getInstance、createObject和loadObjectsFromFile三个方法都能正常用了,但问题来了——Pool_T现在不能只传一个类型参数实例化了,比如原来的用法:
struct someStruct; class StructPool : public Pool_T<someStruct>;
完全没法用了。
临时解决方案,但需要大量修改现有代码
于是我又定义了另一个模板:
template <typename T> class AlonePool_T: public Pool_T<AlonePool_T<T>, T> { // 空类,用来替代原来Pool_T<someStruct>的用法 }
现在可以通过struct someStruct; class StructPool : public AlonePool_T<someStruct>;实现原有功能,但这要修改大量不是我维护的代码,实在有点头疼。
想请教的问题
有没有办法能同时满足这几点:
- 保留
Pool_T的原始定义(也就是支持单参数实例化) - 创建一个扩展
Pool_T功能的类(新增loadObjectsFromFile方法) - 确保这个类的
getInstance和createObject方法都能正确工作(使用正确的类型)
内容的提问来源于stack exchange,提问作者MichaelCMS
相关产品推荐
相关产品推荐

