You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>;实现原有功能,但这要修改大量不是我维护的代码,实在有点头疼。

想请教的问题

有没有办法能同时满足这几点:

  1. 保留Pool_T的原始定义(也就是支持单参数实例化)
  2. 创建一个扩展Pool_T功能的类(新增loadObjectsFromFile方法)
  3. 确保这个类的getInstance和createObject方法都能正确工作(使用正确的类型)

内容的提问来源于stack exchange,提问作者MichaelCMS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:52:30