Skip to content

Commit 2d12f38

Browse files
committed
new file: doc/exercises/struct-enum.ipynb
1 parent cc1a063 commit 2d12f38

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

doc/exercises/struct-enum.ipynb

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"# struct+enum\n",
8+
"\n",
9+
"在 C++ 中,`struct TypeIndex { enum { ... } };` 这种组合使用方式主要有以下设计目的:\n",
10+
"\n",
11+
"- 作用域封装\n",
12+
" - 将枚举常量封装在结构体作用域内,避免全局命名空间污染\n",
13+
" - 访问时必须使用 `TypeIndex::kRoot` 的完整形式,提高代码可读性\n",
14+
"- 类型安全\n",
15+
" - 相比普通枚举,结构体嵌套枚举能提供更好的类型检查\n",
16+
" - 防止与其他模块的同名枚举值冲突\n",
17+
"- 扩展性设计\n",
18+
" - 预留未来添加静态方法的可能性(如转换方法)\n",
19+
" - 保持与旧代码兼容的同时支持新特性\n",
20+
"- API 设计考量\n",
21+
" ```cpp\n",
22+
" // 对比普通枚举的访问方式\n",
23+
" TypeIndex::kRoot // 结构体+枚举方式\n",
24+
" TYPE_INDEX_ROOT // 传统宏定义方式(更易冲突)\n",
25+
" ```\n",
26+
"- 二进制兼容\n",
27+
" - 保持枚举值的底层类型固定(默认 `int`)\n",
28+
" - 不同编译器/平台间保持稳定\n",
29+
"- 文档组织\n",
30+
" - 通过结构体注释集中说明所有相关枚举的用途\n",
31+
" - 示例代码中清晰地展示了TVM核心类型的索引分配:\n",
32+
" ```cpp\n",
33+
" struct TypeIndex {\n",
34+
" enum {\n",
35+
" kRoot = 0, // 根对象\n",
36+
" kRuntimeModule = 1, // 模块\n",
37+
" kRuntimeNDArray = 2, // 多维数组\n",
38+
" // ... 其他核心类型\n",
39+
" kDynamic = 12 // 动态分配类型\n",
40+
" };\n",
41+
" };\n",
42+
" ```"
43+
]
44+
},
45+
{
46+
"cell_type": "markdown",
47+
"metadata": {},
48+
"source": [
49+
"这种设计模式在系统级编程中非常常见(如 LLVM、Clang 等编译器基础架构),既能保持代码整洁,又能为未来的扩展保留灵活性。"
50+
]
51+
},
52+
{
53+
"cell_type": "code",
54+
"execution_count": 3,
55+
"metadata": {},
56+
"outputs": [],
57+
"source": [
58+
"struct Type {\n",
59+
"enum {\n",
60+
" kName = 0, // 类型名称\n",
61+
" kId = 1, // 类型 ID\n",
62+
"};\n",
63+
"};"
64+
]
65+
},
66+
{
67+
"cell_type": "code",
68+
"execution_count": 8,
69+
"metadata": {},
70+
"outputs": [
71+
{
72+
"data": {
73+
"text/plain": [
74+
"0"
75+
]
76+
},
77+
"execution_count": 8,
78+
"metadata": {},
79+
"output_type": "execute_result"
80+
}
81+
],
82+
"source": [
83+
"static constexpr const uint32_t _type_name = Type::kName;\n",
84+
"_type_name"
85+
]
86+
},
87+
{
88+
"cell_type": "code",
89+
"execution_count": null,
90+
"metadata": {},
91+
"outputs": [],
92+
"source": []
93+
}
94+
],
95+
"metadata": {
96+
"kernelspec": {
97+
"display_name": "C++14",
98+
"language": "C++14",
99+
"name": "xcpp14"
100+
},
101+
"language_info": {
102+
"codemirror_mode": "text/x-c++src",
103+
"file_extension": ".cpp",
104+
"mimetype": "text/x-c++src",
105+
"name": "c++",
106+
"version": "14"
107+
}
108+
},
109+
"nbformat": 4,
110+
"nbformat_minor": 2
111+
}

0 commit comments

Comments
 (0)