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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:21:00