struct+enum#
在 C++ 中,struct TypeIndex { enum { ... } };
这种组合使用方式主要有以下设计目的:
作用域封装
将枚举常量封装在结构体作用域内,避免全局命名空间污染
访问时必须使用
TypeIndex::kRoot
的完整形式,提高代码可读性
类型安全
相比普通枚举,结构体嵌套枚举能提供更好的类型检查
防止与其他模块的同名枚举值冲突
扩展性设计
预留未来添加静态方法的可能性(如转换方法)
保持与旧代码兼容的同时支持新特性
API 设计考量
// 对比普通枚举的访问方式 TypeIndex::kRoot // 结构体+枚举方式 TYPE_INDEX_ROOT // 传统宏定义方式(更易冲突)
二进制兼容
保持枚举值的底层类型固定(默认
int
)不同编译器/平台间保持稳定
文档组织
通过结构体注释集中说明所有相关枚举的用途
示例代码中清晰地展示了TVM核心类型的索引分配:
struct TypeIndex { enum { kRoot = 0, // 根对象 kRuntimeModule = 1, // 模块 kRuntimeNDArray = 2, // 多维数组 // ... 其他核心类型 kDynamic = 12 // 动态分配类型 }; };
这种设计模式在系统级编程中非常常见(如 LLVM、Clang 等编译器基础架构),既能保持代码整洁,又能为未来的扩展保留灵活性。
struct Type {
enum {
kName = 0, // 类型名称
kId = 1, // 类型 ID
};
};
static constexpr const uint32_t _type_name = Type::kName;
_type_name
0