struct+enum

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