C++11下模板如何根据输入类型是否为抽象类适配不同行为
解决方案
核心思路是用C++11标准自带的std::is_abstract类型萃取能力,配合模板偏特化实现不同类型的分支逻辑,全程不需要第三方依赖,也不需要修改现有业务类中已经定义的DerivedRegister相关代码。
前置依赖
仅引入C++11标准头文件即可:
#include <type_traits>
具体实现
首先补充原有方案中缺失的createT通用实现,再替换原有DerivedRegister模板的代码:
// 通用实例化函数,仅非抽象类会触发该函数的实例化 template<typename T> Base* createT() { return new T; } // DerivedRegister模板主声明,第二个参数为默认占位参数,兼容原有代码的调用方式 template<typename T, typename = void> struct DerivedRegister : BaseFactory { }; // 偏特化1:匹配非抽象类,执行正常注册逻辑 template<typename T> struct DerivedRegister<T, typename std::enable_if<!std::is_abstract<T>::value>::type> : BaseFactory { DerivedRegister(std::string const& s) { getMap()->insert(std::make_pair(s, &createT<T>)); } }; // 偏特化2:匹配抽象类,空实现不注册 template<typename T> struct DerivedRegister<T, typename std::enable_if<std::is_abstract<T>::value>::type> : BaseFactory { DerivedRegister(std::string const& s) { // 无任何操作,不会生成实例化抽象类的代码,也不会向工厂map插入无效条目 } };
扩展说明
如果需要同时过滤其他不可默认构造的类型,可以在std::enable_if的判断条件中追加std::is_default_constructible<T>::value判断,适配更多业务场景。
内容的提问来源于stack exchange,提问作者Fury
相关产品推荐
相关产品推荐

