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

C++如何使用模板参数包实现支持多枚举继承的InheritEnum类

可变参数版本InheritEnum实现方案

你可以通过递归继承+可变参数模板的方式完成改造,无需手动修改模板实现即可支持任意数量的枚举类型,完整代码如下:

inheritenum.h 实现

#include <type_traits>

// 前置声明
template <typename BaseEnumT, typename... EnumG>
class InheritEnum;

// 递归终止层:仅处理基础枚举类型
template <typename BaseEnumT>
class InheritEnum<BaseEnumT> {
public:
    InheritEnum() = default;
    InheritEnum(BaseEnumT e) : base_val_(static_cast<std::underlying_type_t<BaseEnumT>>(e)) {}
    explicit InheritEnum(int val) : base_val_(val) {}
    operator BaseEnumT() const { return static_cast<BaseEnumT>(base_val_); }
protected:
    int base_val_ = 0;
};

// 递归展开层:逐个处理参数包中的枚举类型
template <typename BaseEnumT, typename CurEnumT, typename... RestEnumT>
class InheritEnum<BaseEnumT, CurEnumT, RestEnumT...> : public InheritEnum<BaseEnumT, RestEnumT...> {
    using Base = InheritEnum<BaseEnumT, RestEnumT...>;
public:
    // 继承父类所有构造函数
    using Base::Base;
    // 新增当前枚举类型的构造函数
    InheritEnum(CurEnumT e) : Base(static_cast<int>(e)) {}
    // 新增当前枚举类型的转换运算符
    operator CurEnumT() const { return static_cast<CurEnumT>(this->base_val_); }
};

调用示例

enum class Fruit { apple, orange };
enum class Drink { water, milk };
enum class Food { pasta, fish };

// 支持任意数量的枚举类型参数
using Eatable = InheritEnum<Fruit, Drink, Food>;

void GetIt(Eatable eatable) {}

int main(){
    GetIt(Fruit::apple);
    GetIt(Drink::water);
    GetIt(Food::fish);
    return 0;
}

实现说明

  • 采用递归继承方式展开可变参数包,每一层递归自动生成对应枚举类型的构造函数和类型转换运算符
  • 统一用单成员变量存储枚举值,相比原实现每个枚举单独存变量的方式更节省空间
  • 兼容C++17及以上标准,新增枚举类型时仅需修改模板实例化的参数列表即可,无需调整模板实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:24:04