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
相关产品推荐
相关产品推荐

