如何无需指定模板参数调用模板派生类的静态方法?
如何无需模板参数直接调用
Task::StartScheduler()? 其实你的核心需求是让这个静态调度器启动函数摆脱模板参数的束缚,毕竟它根本不需要依赖RUNNABLE这个模板参数对吧?这里有几个实用的方案:
方案1:把静态函数移到非模板基类中
既然StartScheduler不依赖模板参数,那完全可以把它抽出来放到一个独立的非模板基类里,让Task模板继承这个基类:
// 新建一个非模板的基类,存放不依赖模板的静态函数 class TaskCore { public: static void StartScheduler() { // 这里写启动系统调度器的代码 } }; template<class RUNNABLE> class Task : public RUNNABLE, public TaskCore { // 这里保留Task模板原本的其他代码 };
之后你就可以直接调用TaskCore::StartScheduler();,干净利落。如果非要用Task::的写法,也可以通过Task<UselessClass>::StartScheduler(),但更推荐直接用基类调用,逻辑更清晰。
方案2:给模板类设置默认模板参数(C++11+)
如果想继续保留Task::的调用形式,可以给Task模板的RUNNABLE参数设置一个默认值,比如你原本的UselessClass:
class UselessClass {}; // 给RUNNABLE添加默认模板参数 template<class RUNNABLE = UselessClass> class Task : public RUNNABLE { public: static void StartScheduler() { //Start system scheduler } };
这样在C11及以上版本中,你可以写成Task<>::StartScheduler();(注意不能省略尖括号);如果是C17及更高版本,得益于类模板实参推导(CTAD),你甚至可以直接写Task::StartScheduler();,编译器会自动使用默认的模板参数完成实例化。
方案3:将静态函数独立为命名空间下的非模板函数
如果StartScheduler本质上是一个全局可用的调度器启动逻辑,完全可以把它从模板类中剥离出来,放到一个命名空间里:
namespace TaskHelpers { void StartScheduler() { //Start system scheduler } } template<class RUNNABLE> class Task : public RUNNABLE { // Task模板的原有代码 };
之后直接调用TaskHelpers::StartScheduler();就行,这种方式最灵活,也避免了模板带来的不必要耦合。
内容的提问来源于stack exchange,提问作者Parminder Singh
相关产品推荐
相关产品推荐

