[{"data":1,"prerenderedAt":5334},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":4775,"wiki:author-members":5322},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":66,"chapterOrder":4763,"date":4764,"description":59,"docKey":4765,"docRoot":4766,"docTitle":4767,"extension":4768,"isWikiDoc":120,"isWikiIndex":4769,"meta":4770,"navigation":120,"path":4771,"seo":4772,"stem":4773,"wikiDepth":66,"__hash__":4774},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant.md","std::variant",[7],"董佳辉",{"type":9,"value":10,"toc":4739},"minimark",[11,15,24,34,37,43,47,50,53,75,78,338,341,436,439,444,760,766,774,778,1205,1209,1215,1219,1618,1622,1628,1632,2053,2057,2063,2070,2073,2088,2091,2097,2113,2116,2139,2142,2179,2186,2195,2208,2211,2219,2222,2231,2234,2240,2242,2251,2254,2262,2265,2268,2282,2285,2305,2307,2311,2317,2326,2328,2401,2404,2412,2415,2434,2437,2440,2460,2463,2471,2474,2479,2481,2489,2492,2521,2527,2546,2551,2610,2613,2621,2623,2682,2684,2692,2694,2743,2745,2753,2756,2764,2770,2772,2778,2780,2811,2816,2824,2830,2844,2847,2874,2877,2883,2885,2888,2919,2922,2936,2939,2966,2969,2975,2977,2980,3007,3010,3035,3037,3043,3046,3052,3057,3066,3068,3074,3077,3082,3086,3089,3098,3101,3104,3110,3113,3121,3124,3130,3132,3136,3138,3202,3205,3208,3210,3279,3282,3297,3300,3312,3315,3381,3384,3393,3395,3410,3413,3415,3419,3422,3454,3457,3473,3479,3609,3612,3614,3617,3620,3634,3637,3640,3648,3651,3657,3660,3668,3671,3674,3690,3693,3699,3701,3715,3718,3732,3735,3751,3754,3760,3763,3766,3774,3780,3782,3785,3788,3890,3894,3899,3956,3960,4452,4456,4462,4472,4475,4480,4531,4541,4546,4573,4576,4581,4655,4661,4664,4709,4712,4735],[12,13,14],"h2",{"id":14},"本节解决什么问题",[16,17,18,19,23],"p",{},"有时候一个变量需要存储\"可能是 int，也可能是 string，也可能是 double\"的值。传统的做法是 ",[20,21,22],"code",{},"union","（C 语言），但它不类型安全——你不知道当前存的是哪种类型，访问错了就崩溃。",[16,25,26,28,29,33],{},[20,27,5],{}," 是类型安全的联合体，能存储多种类型之一，并且",[30,31,32],"strong",{},"知道当前存的是哪种类型","。",[12,35,36],{"id":36},"这个特性是什么",[16,38,39,42],{},[20,40,41],{},"std::variant\u003CT1, T2, ...>"," 是 C++17 引入的类型安全的联合体。在同一时刻，它只存储其中一种类型的值。访问时编译器会帮你检查，不会出现\"访问了错误类型\"的问题。",[12,44,46],{"id":45},"c-标准版本","C++ 标准版本",[16,48,49],{},"C++17",[12,51,52],{"id":52},"需要的头文件",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cvariant>\n","cpp","",[20,61,62],{"__ignoreMap":59},[63,64,67,71],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"szBVR","#include",[63,72,74],{"class":73},"sZZnC"," \u003Cvariant>\n",[12,76,77],{"id":77},"基本语法",[54,79,81],{"className":56,"code":80,"language":58,"meta":59,"style":59},"std::variant\u003Cint, double, std::string> v;\n\nv = 42;                      \u002F\u002F 存 int\nv = 3.14;                    \u002F\u002F 存 double\nv = std::string(\"hello\");   \u002F\u002F 存 string\n\n\u002F\u002F 访问方式 1：std::get\u003CT>(v) —— 类型不对抛异常\nint n = std::get\u003Cint>(v);\n\n\u002F\u002F 访问方式 2：std::get_if\u003CT>(&v) —— 类型不对返回 nullptr\nif (auto* p = std::get_if\u003Cint>(&v)) { ... }\n\n\u002F\u002F 访问方式 3：std::visit —— 用 visitor 模式处理所有可能的类型\nstd::visit([](auto&& val) { ... }, v);\n\n\u002F\u002F 查询当前存储的类型的索引\nsize_t idx = v.index();  \u002F\u002F 0-based\n",[20,82,83,115,122,142,157,185,190,196,222,227,233,270,275,281,304,309,315],{"__ignoreMap":59},[63,84,85,89,93,96,99,102,104,106,109,112],{"class":65,"line":66},[63,86,88],{"class":87},"sScJk","std",[63,90,92],{"class":91},"sVt8B","::variant",[63,94,95],{"class":69},"\u003Cint",[63,97,98],{"class":91},", ",[63,100,101],{"class":69},"double",[63,103,98],{"class":91},[63,105,88],{"class":87},[63,107,108],{"class":91},"::string",[63,110,111],{"class":69},">",[63,113,114],{"class":91}," v;\n",[63,116,118],{"class":65,"line":117},2,[63,119,121],{"emptyLinePlaceholder":120},true,"\n",[63,123,125,128,131,135,138],{"class":65,"line":124},3,[63,126,127],{"class":91},"v ",[63,129,130],{"class":69},"=",[63,132,134],{"class":133},"sj4cs"," 42",[63,136,137],{"class":91},";",[63,139,141],{"class":140},"sJ8bj","                      \u002F\u002F 存 int\n",[63,143,145,147,149,152,154],{"class":65,"line":144},4,[63,146,127],{"class":91},[63,148,130],{"class":69},[63,150,151],{"class":133}," 3.14",[63,153,137],{"class":91},[63,155,156],{"class":140},"                    \u002F\u002F 存 double\n",[63,158,160,162,164,167,170,173,176,179,182],{"class":65,"line":159},5,[63,161,127],{"class":91},[63,163,130],{"class":69},[63,165,166],{"class":87}," std",[63,168,169],{"class":91},"::",[63,171,172],{"class":87},"string",[63,174,175],{"class":91},"(",[63,177,178],{"class":73},"\"hello\"",[63,180,181],{"class":91},");",[63,183,184],{"class":140},"   \u002F\u002F 存 string\n",[63,186,188],{"class":65,"line":187},6,[63,189,121],{"emptyLinePlaceholder":120},[63,191,193],{"class":65,"line":192},7,[63,194,195],{"class":140},"\u002F\u002F 访问方式 1：std::get\u003CT>(v) —— 类型不对抛异常\n",[63,197,199,202,205,207,209,211,214,217,219],{"class":65,"line":198},8,[63,200,201],{"class":69},"int",[63,203,204],{"class":91}," n ",[63,206,130],{"class":69},[63,208,166],{"class":87},[63,210,169],{"class":91},[63,212,213],{"class":87},"get",[63,215,216],{"class":91},"\u003C",[63,218,201],{"class":69},[63,220,221],{"class":91},">(v);\n",[63,223,225],{"class":65,"line":224},9,[63,226,121],{"emptyLinePlaceholder":120},[63,228,230],{"class":65,"line":229},10,[63,231,232],{"class":140},"\u002F\u002F 访问方式 2：std::get_if\u003CT>(&v) —— 类型不对返回 nullptr\n",[63,234,236,239,242,245,248,250,252,254,257,259,261,264,267],{"class":65,"line":235},11,[63,237,238],{"class":69},"if",[63,240,241],{"class":91}," (",[63,243,244],{"class":69},"auto*",[63,246,247],{"class":91}," p ",[63,249,130],{"class":69},[63,251,166],{"class":87},[63,253,169],{"class":91},[63,255,256],{"class":87},"get_if",[63,258,216],{"class":91},[63,260,201],{"class":69},[63,262,263],{"class":91},">(",[63,265,266],{"class":69},"&",[63,268,269],{"class":91},"v)) { ... }\n",[63,271,273],{"class":65,"line":272},12,[63,274,121],{"emptyLinePlaceholder":120},[63,276,278],{"class":65,"line":277},13,[63,279,280],{"class":140},"\u002F\u002F 访问方式 3：std::visit —— 用 visitor 模式处理所有可能的类型\n",[63,282,284,286,288,291,294,297,301],{"class":65,"line":283},14,[63,285,88],{"class":87},[63,287,169],{"class":91},[63,289,290],{"class":87},"visit",[63,292,293],{"class":91},"([](",[63,295,296],{"class":69},"auto&&",[63,298,300],{"class":299},"s4XuR"," val",[63,302,303],{"class":91},") { ... }, v);\n",[63,305,307],{"class":65,"line":306},15,[63,308,121],{"emptyLinePlaceholder":120},[63,310,312],{"class":65,"line":311},16,[63,313,314],{"class":140},"\u002F\u002F 查询当前存储的类型的索引\n",[63,316,318,321,324,326,329,332,335],{"class":65,"line":317},17,[63,319,320],{"class":69},"size_t",[63,322,323],{"class":91}," idx ",[63,325,130],{"class":69},[63,327,328],{"class":91}," v.",[63,330,331],{"class":87},"index",[63,333,334],{"class":91},"();",[63,336,337],{"class":140},"  \u002F\u002F 0-based\n",[12,339,340],{"id":340},"常用用法",[342,343,344,358],"table",{},[345,346,347],"thead",{},[348,349,350,355],"tr",{},[351,352,354],"th",{"align":353},"left","操作",[351,356,357],{"align":353},"说明",[359,360,361,372,382,396,406,416,426],"tbody",{},[348,362,363,369],{},[364,365,366],"td",{"align":353},[20,367,368],{},"v = value;",[364,370,371],{"align":353},"赋值（自动切换类型）",[348,373,374,379],{},[364,375,376],{"align":353},[20,377,378],{},"v.emplace\u003CT>(args...)",[364,380,381],{"align":353},"原地构造",[348,383,384,389],{},[364,385,386],{"align":353},[20,387,388],{},"std::get\u003CT>(v)",[364,390,391,392,395],{"align":353},"获取值（类型不对抛 ",[20,393,394],{},"std::bad_variant_access","）",[348,397,398,403],{},[364,399,400],{"align":353},[20,401,402],{},"std::get_if\u003CT>(&v)",[364,404,405],{"align":353},"安全获取（类型不对返回 nullptr）",[348,407,408,413],{},[364,409,410],{"align":353},[20,411,412],{},"v.index()",[364,414,415],{"align":353},"返回当前类型的索引（0-based）",[348,417,418,423],{},[364,419,420],{"align":353},[20,421,422],{},"std::visit(visitor, v)",[364,424,425],{"align":353},"用 visitor 模式处理",[348,427,428,433],{},[364,429,430],{"align":353},[20,431,432],{},"std::holds_alternative\u003CT>(v)",[364,434,435],{"align":353},"判断是否持有 T 类型",[12,437,438],{"id":438},"示例代码",[440,441,443],"h3",{"id":442},"示例-1variant-基本用法存不同类型的值","示例 1：variant 基本用法——存不同类型的值",[54,445,447],{"className":56,"code":446,"language":58,"meta":59,"style":59},"#include \u003Ciostream>\n#include \u003Cvariant>\n#include \u003Cstring>\n#include \u003Ctype_traits>\n\nint main()\n{\n    \u002F\u002F v 可以存 int、double 或 string\n    std::variant\u003Cint, double, std::string> v;\n\n    v = 42;\n    std::cout \u003C\u003C \"int: \" \u003C\u003C std::get\u003Cint>(v) \u003C\u003C \"\\n\";\n\n    v = 3.14;\n    std::cout \u003C\u003C \"double: \" \u003C\u003C std::get\u003Cdouble>(v) \u003C\u003C \"\\n\";\n\n    v = std::string(\"hello\");\n    std::cout \u003C\u003C \"string: \" \u003C\u003C std::get\u003Cstd::string>(v) \u003C\u003C \"\\n\";\n\n    \u002F\u002F 查看当前类型索引\n    std::cout \u003C\u003C \"current index: \" \u003C\u003C v.index() \u003C\u003C \"\\n\";  \u002F\u002F 2 (string)\n\n    return 0;\n}\n",[20,448,449,456,462,469,476,480,490,495,500,523,527,539,581,585,595,630,634,653,693,698,704,738,743,754],{"__ignoreMap":59},[63,450,451,453],{"class":65,"line":66},[63,452,70],{"class":69},[63,454,455],{"class":73}," \u003Ciostream>\n",[63,457,458,460],{"class":65,"line":117},[63,459,70],{"class":69},[63,461,74],{"class":73},[63,463,464,466],{"class":65,"line":124},[63,465,70],{"class":69},[63,467,468],{"class":73}," \u003Cstring>\n",[63,470,471,473],{"class":65,"line":144},[63,472,70],{"class":69},[63,474,475],{"class":73}," \u003Ctype_traits>\n",[63,477,478],{"class":65,"line":159},[63,479,121],{"emptyLinePlaceholder":120},[63,481,482,484,487],{"class":65,"line":187},[63,483,201],{"class":69},[63,485,486],{"class":87}," main",[63,488,489],{"class":91},"()\n",[63,491,492],{"class":65,"line":192},[63,493,494],{"class":91},"{\n",[63,496,497],{"class":65,"line":198},[63,498,499],{"class":140},"    \u002F\u002F v 可以存 int、double 或 string\n",[63,501,502,505,507,509,511,513,515,517,519,521],{"class":65,"line":224},[63,503,504],{"class":87},"    std",[63,506,92],{"class":91},[63,508,95],{"class":69},[63,510,98],{"class":91},[63,512,101],{"class":69},[63,514,98],{"class":91},[63,516,88],{"class":87},[63,518,108],{"class":91},[63,520,111],{"class":69},[63,522,114],{"class":91},[63,524,525],{"class":65,"line":229},[63,526,121],{"emptyLinePlaceholder":120},[63,528,529,532,534,536],{"class":65,"line":235},[63,530,531],{"class":91},"    v ",[63,533,130],{"class":69},[63,535,134],{"class":133},[63,537,538],{"class":91},";\n",[63,540,541,543,546,549,552,555,557,559,561,563,565,568,570,573,576,579],{"class":65,"line":272},[63,542,504],{"class":87},[63,544,545],{"class":91},"::cout ",[63,547,548],{"class":69},"\u003C\u003C",[63,550,551],{"class":73}," \"int: \"",[63,553,554],{"class":69}," \u003C\u003C",[63,556,166],{"class":87},[63,558,169],{"class":91},[63,560,213],{"class":87},[63,562,216],{"class":91},[63,564,201],{"class":69},[63,566,567],{"class":91},">(v) ",[63,569,548],{"class":69},[63,571,572],{"class":73}," \"",[63,574,575],{"class":133},"\\n",[63,577,578],{"class":73},"\"",[63,580,538],{"class":91},[63,582,583],{"class":65,"line":277},[63,584,121],{"emptyLinePlaceholder":120},[63,586,587,589,591,593],{"class":65,"line":283},[63,588,531],{"class":91},[63,590,130],{"class":69},[63,592,151],{"class":133},[63,594,538],{"class":91},[63,596,597,599,601,603,606,608,610,612,614,616,618,620,622,624,626,628],{"class":65,"line":306},[63,598,504],{"class":87},[63,600,545],{"class":91},[63,602,548],{"class":69},[63,604,605],{"class":73}," \"double: \"",[63,607,554],{"class":69},[63,609,166],{"class":87},[63,611,169],{"class":91},[63,613,213],{"class":87},[63,615,216],{"class":91},[63,617,101],{"class":69},[63,619,567],{"class":91},[63,621,548],{"class":69},[63,623,572],{"class":73},[63,625,575],{"class":133},[63,627,578],{"class":73},[63,629,538],{"class":91},[63,631,632],{"class":65,"line":311},[63,633,121],{"emptyLinePlaceholder":120},[63,635,636,638,640,642,644,646,648,650],{"class":65,"line":317},[63,637,531],{"class":91},[63,639,130],{"class":69},[63,641,166],{"class":87},[63,643,169],{"class":91},[63,645,172],{"class":87},[63,647,175],{"class":91},[63,649,178],{"class":73},[63,651,652],{"class":91},");\n",[63,654,656,658,660,662,665,667,669,671,673,675,677,679,681,683,685,687,689,691],{"class":65,"line":655},18,[63,657,504],{"class":87},[63,659,545],{"class":91},[63,661,548],{"class":69},[63,663,664],{"class":73}," \"string: \"",[63,666,554],{"class":69},[63,668,166],{"class":87},[63,670,169],{"class":91},[63,672,213],{"class":87},[63,674,216],{"class":91},[63,676,88],{"class":87},[63,678,169],{"class":91},[63,680,172],{"class":87},[63,682,567],{"class":91},[63,684,548],{"class":69},[63,686,572],{"class":73},[63,688,575],{"class":133},[63,690,578],{"class":73},[63,692,538],{"class":91},[63,694,696],{"class":65,"line":695},19,[63,697,121],{"emptyLinePlaceholder":120},[63,699,701],{"class":65,"line":700},20,[63,702,703],{"class":140},"    \u002F\u002F 查看当前类型索引\n",[63,705,707,709,711,713,716,718,720,722,725,727,729,731,733,735],{"class":65,"line":706},21,[63,708,504],{"class":87},[63,710,545],{"class":91},[63,712,548],{"class":69},[63,714,715],{"class":73}," \"current index: \"",[63,717,554],{"class":69},[63,719,328],{"class":91},[63,721,331],{"class":87},[63,723,724],{"class":91},"() ",[63,726,548],{"class":69},[63,728,572],{"class":73},[63,730,575],{"class":133},[63,732,578],{"class":73},[63,734,137],{"class":91},[63,736,737],{"class":140},"  \u002F\u002F 2 (string)\n",[63,739,741],{"class":65,"line":740},22,[63,742,121],{"emptyLinePlaceholder":120},[63,744,746,749,752],{"class":65,"line":745},23,[63,747,748],{"class":69},"    return",[63,750,751],{"class":133}," 0",[63,753,538],{"class":91},[63,755,757],{"class":65,"line":756},24,[63,758,759],{"class":91},"}\n",[16,761,762,765],{},[30,763,764],{},"运行结果","：",[54,767,772],{"className":768,"code":770,"language":771},[769],"language-text","int: 42\ndouble: 3.14\nstring: hello\ncurrent index: 2\n","text",[20,773,770],{"__ignoreMap":59},[440,775,777],{"id":776},"示例-2在示例-1-基础上用-get_if-安全访问","示例 2：在示例 1 基础上，用 get_if 安全访问",[54,779,781],{"className":56,"code":780,"language":58,"meta":59,"style":59},"#include \u003Ciostream>\n#include \u003Cvariant>\n#include \u003Cstring>\n\nvoid print_value(const std::variant\u003Cint, double, std::string>& v)\n{\n    \u002F\u002F 安全方式：逐个尝试，get_if 返回指针\n    if (auto* p = std::get_if\u003Cint>(&v))\n    {\n        std::cout \u003C\u003C \"int: \" \u003C\u003C *p \u003C\u003C \"\\n\";\n    }\n    else if (auto* p = std::get_if\u003Cdouble>(&v))\n    {\n        std::cout \u003C\u003C \"double: \" \u003C\u003C *p \u003C\u003C \"\\n\";\n    }\n    else if (auto* p = std::get_if\u003Cstd::string>(&v))\n    {\n        std::cout \u003C\u003C \"string: \" \u003C\u003C *p \u003C\u003C \"\\n\";\n    }\n}\n\nint main()\n{\n    std::variant\u003Cint, double, std::string> v;\n\n    v = 42;\n    print_value(v);\n\n    v = 3.14159;\n    print_value(v);\n\n    v = std::string(\"C++17\");\n    print_value(v);\n\n    return 0;\n}\n",[20,782,783,789,795,801,805,851,855,860,890,895,924,929,961,965,991,995,1029,1033,1059,1063,1067,1071,1079,1083,1105,1110,1121,1130,1135,1147,1154,1159,1179,1186,1191,1200],{"__ignoreMap":59},[63,784,785,787],{"class":65,"line":66},[63,786,70],{"class":69},[63,788,455],{"class":73},[63,790,791,793],{"class":65,"line":117},[63,792,70],{"class":69},[63,794,74],{"class":73},[63,796,797,799],{"class":65,"line":124},[63,798,70],{"class":69},[63,800,468],{"class":73},[63,802,803],{"class":65,"line":144},[63,804,121],{"emptyLinePlaceholder":120},[63,806,807,810,813,815,818,820,822,825,827,829,831,833,835,837,839,841,843,845,848],{"class":65,"line":159},[63,808,809],{"class":69},"void",[63,811,812],{"class":87}," print_value",[63,814,175],{"class":91},[63,816,817],{"class":69},"const",[63,819,166],{"class":87},[63,821,169],{"class":91},[63,823,824],{"class":87},"variant",[63,826,216],{"class":91},[63,828,201],{"class":69},[63,830,98],{"class":91},[63,832,101],{"class":69},[63,834,98],{"class":91},[63,836,88],{"class":87},[63,838,169],{"class":91},[63,840,172],{"class":87},[63,842,111],{"class":91},[63,844,266],{"class":69},[63,846,847],{"class":299}," v",[63,849,850],{"class":91},")\n",[63,852,853],{"class":65,"line":187},[63,854,494],{"class":91},[63,856,857],{"class":65,"line":192},[63,858,859],{"class":140},"    \u002F\u002F 安全方式：逐个尝试，get_if 返回指针\n",[63,861,862,865,867,869,871,873,875,877,879,881,883,885,887],{"class":65,"line":198},[63,863,864],{"class":69},"    if",[63,866,241],{"class":91},[63,868,244],{"class":69},[63,870,247],{"class":91},[63,872,130],{"class":69},[63,874,166],{"class":87},[63,876,169],{"class":91},[63,878,256],{"class":87},[63,880,216],{"class":91},[63,882,201],{"class":69},[63,884,263],{"class":91},[63,886,266],{"class":69},[63,888,889],{"class":91},"v))\n",[63,891,892],{"class":65,"line":224},[63,893,894],{"class":91},"    {\n",[63,896,897,900,902,904,906,908,911,914,916,918,920,922],{"class":65,"line":229},[63,898,899],{"class":87},"        std",[63,901,545],{"class":91},[63,903,548],{"class":69},[63,905,551],{"class":73},[63,907,554],{"class":69},[63,909,910],{"class":69}," *",[63,912,913],{"class":91},"p ",[63,915,548],{"class":69},[63,917,572],{"class":73},[63,919,575],{"class":133},[63,921,578],{"class":73},[63,923,538],{"class":91},[63,925,926],{"class":65,"line":235},[63,927,928],{"class":91},"    }\n",[63,930,931,934,937,939,941,943,945,947,949,951,953,955,957,959],{"class":65,"line":272},[63,932,933],{"class":69},"    else",[63,935,936],{"class":69}," if",[63,938,241],{"class":91},[63,940,244],{"class":69},[63,942,247],{"class":91},[63,944,130],{"class":69},[63,946,166],{"class":87},[63,948,169],{"class":91},[63,950,256],{"class":87},[63,952,216],{"class":91},[63,954,101],{"class":69},[63,956,263],{"class":91},[63,958,266],{"class":69},[63,960,889],{"class":91},[63,962,963],{"class":65,"line":277},[63,964,894],{"class":91},[63,966,967,969,971,973,975,977,979,981,983,985,987,989],{"class":65,"line":283},[63,968,899],{"class":87},[63,970,545],{"class":91},[63,972,548],{"class":69},[63,974,605],{"class":73},[63,976,554],{"class":69},[63,978,910],{"class":69},[63,980,913],{"class":91},[63,982,548],{"class":69},[63,984,572],{"class":73},[63,986,575],{"class":133},[63,988,578],{"class":73},[63,990,538],{"class":91},[63,992,993],{"class":65,"line":306},[63,994,928],{"class":91},[63,996,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027],{"class":65,"line":311},[63,998,933],{"class":69},[63,1000,936],{"class":69},[63,1002,241],{"class":91},[63,1004,244],{"class":69},[63,1006,247],{"class":91},[63,1008,130],{"class":69},[63,1010,166],{"class":87},[63,1012,169],{"class":91},[63,1014,256],{"class":87},[63,1016,216],{"class":91},[63,1018,88],{"class":87},[63,1020,169],{"class":91},[63,1022,172],{"class":87},[63,1024,263],{"class":91},[63,1026,266],{"class":69},[63,1028,889],{"class":91},[63,1030,1031],{"class":65,"line":317},[63,1032,894],{"class":91},[63,1034,1035,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055,1057],{"class":65,"line":655},[63,1036,899],{"class":87},[63,1038,545],{"class":91},[63,1040,548],{"class":69},[63,1042,664],{"class":73},[63,1044,554],{"class":69},[63,1046,910],{"class":69},[63,1048,913],{"class":91},[63,1050,548],{"class":69},[63,1052,572],{"class":73},[63,1054,575],{"class":133},[63,1056,578],{"class":73},[63,1058,538],{"class":91},[63,1060,1061],{"class":65,"line":695},[63,1062,928],{"class":91},[63,1064,1065],{"class":65,"line":700},[63,1066,759],{"class":91},[63,1068,1069],{"class":65,"line":706},[63,1070,121],{"emptyLinePlaceholder":120},[63,1072,1073,1075,1077],{"class":65,"line":740},[63,1074,201],{"class":69},[63,1076,486],{"class":87},[63,1078,489],{"class":91},[63,1080,1081],{"class":65,"line":745},[63,1082,494],{"class":91},[63,1084,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103],{"class":65,"line":756},[63,1086,504],{"class":87},[63,1088,92],{"class":91},[63,1090,95],{"class":69},[63,1092,98],{"class":91},[63,1094,101],{"class":69},[63,1096,98],{"class":91},[63,1098,88],{"class":87},[63,1100,108],{"class":91},[63,1102,111],{"class":69},[63,1104,114],{"class":91},[63,1106,1108],{"class":65,"line":1107},25,[63,1109,121],{"emptyLinePlaceholder":120},[63,1111,1113,1115,1117,1119],{"class":65,"line":1112},26,[63,1114,531],{"class":91},[63,1116,130],{"class":69},[63,1118,134],{"class":133},[63,1120,538],{"class":91},[63,1122,1124,1127],{"class":65,"line":1123},27,[63,1125,1126],{"class":87},"    print_value",[63,1128,1129],{"class":91},"(v);\n",[63,1131,1133],{"class":65,"line":1132},28,[63,1134,121],{"emptyLinePlaceholder":120},[63,1136,1138,1140,1142,1145],{"class":65,"line":1137},29,[63,1139,531],{"class":91},[63,1141,130],{"class":69},[63,1143,1144],{"class":133}," 3.14159",[63,1146,538],{"class":91},[63,1148,1150,1152],{"class":65,"line":1149},30,[63,1151,1126],{"class":87},[63,1153,1129],{"class":91},[63,1155,1157],{"class":65,"line":1156},31,[63,1158,121],{"emptyLinePlaceholder":120},[63,1160,1162,1164,1166,1168,1170,1172,1174,1177],{"class":65,"line":1161},32,[63,1163,531],{"class":91},[63,1165,130],{"class":69},[63,1167,166],{"class":87},[63,1169,169],{"class":91},[63,1171,172],{"class":87},[63,1173,175],{"class":91},[63,1175,1176],{"class":73},"\"C++17\"",[63,1178,652],{"class":91},[63,1180,1182,1184],{"class":65,"line":1181},33,[63,1183,1126],{"class":87},[63,1185,1129],{"class":91},[63,1187,1189],{"class":65,"line":1188},34,[63,1190,121],{"emptyLinePlaceholder":120},[63,1192,1194,1196,1198],{"class":65,"line":1193},35,[63,1195,748],{"class":69},[63,1197,751],{"class":133},[63,1199,538],{"class":91},[63,1201,1203],{"class":65,"line":1202},36,[63,1204,759],{"class":91},[16,1206,1207,765],{},[30,1208,764],{},[54,1210,1213],{"className":1211,"code":1212,"language":771},[769],"int: 42\ndouble: 3.14159\nstring: C++17\n",[20,1214,1212],{"__ignoreMap":59},[440,1216,1218],{"id":1217},"示例-3在示例-2-基础上用-stdvisit-处理所有类型","示例 3：在示例 2 基础上，用 std::visit 处理所有类型",[54,1220,1222],{"className":56,"code":1221,"language":58,"meta":59,"style":59},"#include \u003Ciostream>\n#include \u003Cvariant>\n#include \u003Cstring>\n\nint main()\n{\n    std::variant\u003Cint, double, std::string> v;\n\n    \u002F\u002F std::visit 配合泛型 lambda 优雅处理所有类型\n    auto printer = [](const auto& val) {\n        std::cout \u003C\u003C \"value: \" \u003C\u003C val \u003C\u003C \"\\n\";\n    };\n\n    v = 42;\n    std::visit(printer, v);\n\n    v = 2.718;\n    std::visit(printer, v);\n\n    v = std::string(\"hello variant\");\n    std::visit(printer, v);\n\n    \u002F\u002F 也可以返回不同类型的值\n    auto to_double = [](const auto& val) -> double {\n        if constexpr (std::is_same_v\u003Cstd::decay_t\u003Cdecltype(val)>, std::string>)\n        {\n            return 0.0;  \u002F\u002F string 不能转 double\n        }\n        else\n        {\n            return static_cast\u003Cdouble>(val);\n        }\n    };\n\n    v = 10;\n    std::cout \u003C\u003C \"to_double: \" \u003C\u003C std::visit(to_double, v) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[20,1223,1224,1230,1236,1242,1246,1254,1258,1280,1284,1289,1312,1338,1343,1347,1357,1368,1372,1383,1393,1397,1416,1426,1430,1435,1460,1502,1507,1520,1525,1530,1534,1544,1548,1552,1556,1567,1599,1604,1613],{"__ignoreMap":59},[63,1225,1226,1228],{"class":65,"line":66},[63,1227,70],{"class":69},[63,1229,455],{"class":73},[63,1231,1232,1234],{"class":65,"line":117},[63,1233,70],{"class":69},[63,1235,74],{"class":73},[63,1237,1238,1240],{"class":65,"line":124},[63,1239,70],{"class":69},[63,1241,468],{"class":73},[63,1243,1244],{"class":65,"line":144},[63,1245,121],{"emptyLinePlaceholder":120},[63,1247,1248,1250,1252],{"class":65,"line":159},[63,1249,201],{"class":69},[63,1251,486],{"class":87},[63,1253,489],{"class":91},[63,1255,1256],{"class":65,"line":187},[63,1257,494],{"class":91},[63,1259,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278],{"class":65,"line":192},[63,1261,504],{"class":87},[63,1263,92],{"class":91},[63,1265,95],{"class":69},[63,1267,98],{"class":91},[63,1269,101],{"class":69},[63,1271,98],{"class":91},[63,1273,88],{"class":87},[63,1275,108],{"class":91},[63,1277,111],{"class":69},[63,1279,114],{"class":91},[63,1281,1282],{"class":65,"line":198},[63,1283,121],{"emptyLinePlaceholder":120},[63,1285,1286],{"class":65,"line":224},[63,1287,1288],{"class":140},"    \u002F\u002F std::visit 配合泛型 lambda 优雅处理所有类型\n",[63,1290,1291,1294,1297,1299,1302,1304,1307,1309],{"class":65,"line":229},[63,1292,1293],{"class":69},"    auto",[63,1295,1296],{"class":91}," printer ",[63,1298,130],{"class":69},[63,1300,1301],{"class":91}," [](",[63,1303,817],{"class":69},[63,1305,1306],{"class":69}," auto&",[63,1308,300],{"class":299},[63,1310,1311],{"class":91},") {\n",[63,1313,1314,1316,1318,1320,1323,1325,1328,1330,1332,1334,1336],{"class":65,"line":235},[63,1315,899],{"class":87},[63,1317,545],{"class":91},[63,1319,548],{"class":69},[63,1321,1322],{"class":73}," \"value: \"",[63,1324,554],{"class":69},[63,1326,1327],{"class":91}," val ",[63,1329,548],{"class":69},[63,1331,572],{"class":73},[63,1333,575],{"class":133},[63,1335,578],{"class":73},[63,1337,538],{"class":91},[63,1339,1340],{"class":65,"line":272},[63,1341,1342],{"class":91},"    };\n",[63,1344,1345],{"class":65,"line":277},[63,1346,121],{"emptyLinePlaceholder":120},[63,1348,1349,1351,1353,1355],{"class":65,"line":283},[63,1350,531],{"class":91},[63,1352,130],{"class":69},[63,1354,134],{"class":133},[63,1356,538],{"class":91},[63,1358,1359,1361,1363,1365],{"class":65,"line":306},[63,1360,504],{"class":87},[63,1362,169],{"class":91},[63,1364,290],{"class":87},[63,1366,1367],{"class":91},"(printer, v);\n",[63,1369,1370],{"class":65,"line":311},[63,1371,121],{"emptyLinePlaceholder":120},[63,1373,1374,1376,1378,1381],{"class":65,"line":317},[63,1375,531],{"class":91},[63,1377,130],{"class":69},[63,1379,1380],{"class":133}," 2.718",[63,1382,538],{"class":91},[63,1384,1385,1387,1389,1391],{"class":65,"line":655},[63,1386,504],{"class":87},[63,1388,169],{"class":91},[63,1390,290],{"class":87},[63,1392,1367],{"class":91},[63,1394,1395],{"class":65,"line":695},[63,1396,121],{"emptyLinePlaceholder":120},[63,1398,1399,1401,1403,1405,1407,1409,1411,1414],{"class":65,"line":700},[63,1400,531],{"class":91},[63,1402,130],{"class":69},[63,1404,166],{"class":87},[63,1406,169],{"class":91},[63,1408,172],{"class":87},[63,1410,175],{"class":91},[63,1412,1413],{"class":73},"\"hello variant\"",[63,1415,652],{"class":91},[63,1417,1418,1420,1422,1424],{"class":65,"line":706},[63,1419,504],{"class":87},[63,1421,169],{"class":91},[63,1423,290],{"class":87},[63,1425,1367],{"class":91},[63,1427,1428],{"class":65,"line":740},[63,1429,121],{"emptyLinePlaceholder":120},[63,1431,1432],{"class":65,"line":745},[63,1433,1434],{"class":140},"    \u002F\u002F 也可以返回不同类型的值\n",[63,1436,1437,1439,1442,1444,1446,1448,1450,1452,1455,1457],{"class":65,"line":756},[63,1438,1293],{"class":69},[63,1440,1441],{"class":91}," to_double ",[63,1443,130],{"class":69},[63,1445,1301],{"class":91},[63,1447,817],{"class":69},[63,1449,1306],{"class":69},[63,1451,300],{"class":299},[63,1453,1454],{"class":91},") -> ",[63,1456,101],{"class":69},[63,1458,1459],{"class":91}," {\n",[63,1461,1462,1465,1468,1470,1472,1475,1477,1479,1481,1484,1487,1490,1492,1494,1496,1498,1500],{"class":65,"line":1107},[63,1463,1464],{"class":69},"        if",[63,1466,1467],{"class":69}," constexpr",[63,1469,241],{"class":91},[63,1471,88],{"class":87},[63,1473,1474],{"class":91},"::is_same_v",[63,1476,216],{"class":69},[63,1478,88],{"class":87},[63,1480,169],{"class":91},[63,1482,1483],{"class":133},"decay_t",[63,1485,1486],{"class":69},"\u003Cdecltype",[63,1488,1489],{"class":91},"(val)",[63,1491,111],{"class":69},[63,1493,98],{"class":91},[63,1495,88],{"class":87},[63,1497,108],{"class":91},[63,1499,111],{"class":69},[63,1501,850],{"class":91},[63,1503,1504],{"class":65,"line":1112},[63,1505,1506],{"class":91},"        {\n",[63,1508,1509,1512,1515,1517],{"class":65,"line":1123},[63,1510,1511],{"class":69},"            return",[63,1513,1514],{"class":133}," 0.0",[63,1516,137],{"class":91},[63,1518,1519],{"class":140},"  \u002F\u002F string 不能转 double\n",[63,1521,1522],{"class":65,"line":1132},[63,1523,1524],{"class":91},"        }\n",[63,1526,1527],{"class":65,"line":1137},[63,1528,1529],{"class":69},"        else\n",[63,1531,1532],{"class":65,"line":1149},[63,1533,1506],{"class":91},[63,1535,1536,1538,1541],{"class":65,"line":1156},[63,1537,1511],{"class":69},[63,1539,1540],{"class":69}," static_cast\u003Cdouble>",[63,1542,1543],{"class":91},"(val);\n",[63,1545,1546],{"class":65,"line":1161},[63,1547,1524],{"class":91},[63,1549,1550],{"class":65,"line":1181},[63,1551,1342],{"class":91},[63,1553,1554],{"class":65,"line":1188},[63,1555,121],{"emptyLinePlaceholder":120},[63,1557,1558,1560,1562,1565],{"class":65,"line":1193},[63,1559,531],{"class":91},[63,1561,130],{"class":69},[63,1563,1564],{"class":133}," 10",[63,1566,538],{"class":91},[63,1568,1569,1571,1573,1575,1578,1580,1582,1584,1586,1589,1591,1593,1595,1597],{"class":65,"line":1202},[63,1570,504],{"class":87},[63,1572,545],{"class":91},[63,1574,548],{"class":69},[63,1576,1577],{"class":73}," \"to_double: \"",[63,1579,554],{"class":69},[63,1581,166],{"class":87},[63,1583,169],{"class":91},[63,1585,290],{"class":87},[63,1587,1588],{"class":91},"(to_double, v) ",[63,1590,548],{"class":69},[63,1592,572],{"class":73},[63,1594,575],{"class":133},[63,1596,578],{"class":73},[63,1598,538],{"class":91},[63,1600,1602],{"class":65,"line":1601},37,[63,1603,121],{"emptyLinePlaceholder":120},[63,1605,1607,1609,1611],{"class":65,"line":1606},38,[63,1608,748],{"class":69},[63,1610,751],{"class":133},[63,1612,538],{"class":91},[63,1614,1616],{"class":65,"line":1615},39,[63,1617,759],{"class":91},[16,1619,1620,765],{},[30,1621,764],{},[54,1623,1626],{"className":1624,"code":1625,"language":771},[769],"value: 42\nvalue: 2.718\nvalue: hello variant\nto_double: 10\n",[20,1627,1625],{"__ignoreMap":59},[440,1629,1631],{"id":1630},"示例-4在示例-3-基础上用-variant-表示消息类型","示例 4：在示例 3 基础上，用 variant 表示消息类型",[54,1633,1635],{"className":56,"code":1634,"language":58,"meta":59,"style":59},"#include \u003Ciostream>\n#include \u003Cvariant>\n#include \u003Cstring>\n\n\u002F\u002F 定义消息类型\nstruct TextMessage { std::string text; };\nstruct NumberMessage { int number; };\nstruct QuitMessage {};\n\nusing Message = std::variant\u003CTextMessage, NumberMessage, QuitMessage>;\n\n\u002F\u002F 处理消息的 visitor\nstruct MessageHandler\n{\n    void operator()(const TextMessage& msg) const\n    {\n        std::cout \u003C\u003C \"Text: \" \u003C\u003C msg.text \u003C\u003C \"\\n\";\n    }\n    void operator()(const NumberMessage& msg) const\n    {\n        std::cout \u003C\u003C \"Number: \" \u003C\u003C msg.number \u003C\u003C \"\\n\";\n    }\n    void operator()(const QuitMessage&) const\n    {\n        std::cout \u003C\u003C \"Quit!\\n\";\n    }\n};\n\nint main()\n{\n    Message msg;\n\n    msg = TextMessage{\"Hello World\"};\n    std::visit(MessageHandler{}, msg);\n\n    msg = NumberMessage{42};\n    std::visit(MessageHandler{}, msg);\n\n    msg = QuitMessage{};\n    std::visit(MessageHandler{}, msg);\n\n    return 0;\n}\n",[20,1636,1637,1643,1649,1655,1659,1664,1680,1694,1704,1708,1743,1747,1752,1759,1763,1791,1795,1821,1825,1847,1851,1877,1881,1901,1905,1922,1926,1931,1935,1943,1947,1952,1956,1971,1982,1986,2000,2010,2014,2023,2034,2039,2048],{"__ignoreMap":59},[63,1638,1639,1641],{"class":65,"line":66},[63,1640,70],{"class":69},[63,1642,455],{"class":73},[63,1644,1645,1647],{"class":65,"line":117},[63,1646,70],{"class":69},[63,1648,74],{"class":73},[63,1650,1651,1653],{"class":65,"line":124},[63,1652,70],{"class":69},[63,1654,468],{"class":73},[63,1656,1657],{"class":65,"line":144},[63,1658,121],{"emptyLinePlaceholder":120},[63,1660,1661],{"class":65,"line":159},[63,1662,1663],{"class":140},"\u002F\u002F 定义消息类型\n",[63,1665,1666,1669,1672,1675,1677],{"class":65,"line":187},[63,1667,1668],{"class":69},"struct",[63,1670,1671],{"class":87}," TextMessage",[63,1673,1674],{"class":91}," { ",[63,1676,88],{"class":87},[63,1678,1679],{"class":91},"::string text; };\n",[63,1681,1682,1684,1687,1689,1691],{"class":65,"line":192},[63,1683,1668],{"class":69},[63,1685,1686],{"class":87}," NumberMessage",[63,1688,1674],{"class":91},[63,1690,201],{"class":69},[63,1692,1693],{"class":91}," number; };\n",[63,1695,1696,1698,1701],{"class":65,"line":198},[63,1697,1668],{"class":69},[63,1699,1700],{"class":87}," QuitMessage",[63,1702,1703],{"class":91}," {};\n",[63,1705,1706],{"class":65,"line":224},[63,1707,121],{"emptyLinePlaceholder":120},[63,1709,1710,1713,1716,1719,1721,1723,1725,1727,1730,1732,1735,1737,1740],{"class":65,"line":229},[63,1711,1712],{"class":69},"using",[63,1714,1715],{"class":87}," Message",[63,1717,1718],{"class":69}," =",[63,1720,166],{"class":87},[63,1722,169],{"class":91},[63,1724,824],{"class":87},[63,1726,216],{"class":91},[63,1728,1729],{"class":87},"TextMessage",[63,1731,98],{"class":91},[63,1733,1734],{"class":87},"NumberMessage",[63,1736,98],{"class":91},[63,1738,1739],{"class":87},"QuitMessage",[63,1741,1742],{"class":91},">;\n",[63,1744,1745],{"class":65,"line":235},[63,1746,121],{"emptyLinePlaceholder":120},[63,1748,1749],{"class":65,"line":272},[63,1750,1751],{"class":140},"\u002F\u002F 处理消息的 visitor\n",[63,1753,1754,1756],{"class":65,"line":277},[63,1755,1668],{"class":69},[63,1757,1758],{"class":87}," MessageHandler\n",[63,1760,1761],{"class":65,"line":283},[63,1762,494],{"class":91},[63,1764,1765,1768,1771,1774,1776,1778,1780,1782,1785,1788],{"class":65,"line":306},[63,1766,1767],{"class":69},"    void",[63,1769,1770],{"class":69}," operator",[63,1772,1773],{"class":87},"()",[63,1775,175],{"class":91},[63,1777,817],{"class":69},[63,1779,1671],{"class":87},[63,1781,266],{"class":69},[63,1783,1784],{"class":299}," msg",[63,1786,1787],{"class":91},") ",[63,1789,1790],{"class":69},"const\n",[63,1792,1793],{"class":65,"line":311},[63,1794,894],{"class":91},[63,1796,1797,1799,1801,1803,1806,1808,1811,1813,1815,1817,1819],{"class":65,"line":317},[63,1798,899],{"class":87},[63,1800,545],{"class":91},[63,1802,548],{"class":69},[63,1804,1805],{"class":73}," \"Text: \"",[63,1807,554],{"class":69},[63,1809,1810],{"class":91}," msg.text ",[63,1812,548],{"class":69},[63,1814,572],{"class":73},[63,1816,575],{"class":133},[63,1818,578],{"class":73},[63,1820,538],{"class":91},[63,1822,1823],{"class":65,"line":655},[63,1824,928],{"class":91},[63,1826,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845],{"class":65,"line":695},[63,1828,1767],{"class":69},[63,1830,1770],{"class":69},[63,1832,1773],{"class":87},[63,1834,175],{"class":91},[63,1836,817],{"class":69},[63,1838,1686],{"class":87},[63,1840,266],{"class":69},[63,1842,1784],{"class":299},[63,1844,1787],{"class":91},[63,1846,1790],{"class":69},[63,1848,1849],{"class":65,"line":700},[63,1850,894],{"class":91},[63,1852,1853,1855,1857,1859,1862,1864,1867,1869,1871,1873,1875],{"class":65,"line":706},[63,1854,899],{"class":87},[63,1856,545],{"class":91},[63,1858,548],{"class":69},[63,1860,1861],{"class":73}," \"Number: \"",[63,1863,554],{"class":69},[63,1865,1866],{"class":91}," msg.number ",[63,1868,548],{"class":69},[63,1870,572],{"class":73},[63,1872,575],{"class":133},[63,1874,578],{"class":73},[63,1876,538],{"class":91},[63,1878,1879],{"class":65,"line":740},[63,1880,928],{"class":91},[63,1882,1883,1885,1887,1889,1891,1893,1895,1897,1899],{"class":65,"line":745},[63,1884,1767],{"class":69},[63,1886,1770],{"class":69},[63,1888,1773],{"class":87},[63,1890,175],{"class":91},[63,1892,817],{"class":69},[63,1894,1700],{"class":87},[63,1896,266],{"class":69},[63,1898,1787],{"class":91},[63,1900,1790],{"class":69},[63,1902,1903],{"class":65,"line":756},[63,1904,894],{"class":91},[63,1906,1907,1909,1911,1913,1916,1918,1920],{"class":65,"line":1107},[63,1908,899],{"class":87},[63,1910,545],{"class":91},[63,1912,548],{"class":69},[63,1914,1915],{"class":73}," \"Quit!",[63,1917,575],{"class":133},[63,1919,578],{"class":73},[63,1921,538],{"class":91},[63,1923,1924],{"class":65,"line":1112},[63,1925,928],{"class":91},[63,1927,1928],{"class":65,"line":1123},[63,1929,1930],{"class":91},"};\n",[63,1932,1933],{"class":65,"line":1132},[63,1934,121],{"emptyLinePlaceholder":120},[63,1936,1937,1939,1941],{"class":65,"line":1137},[63,1938,201],{"class":69},[63,1940,486],{"class":87},[63,1942,489],{"class":91},[63,1944,1945],{"class":65,"line":1149},[63,1946,494],{"class":91},[63,1948,1949],{"class":65,"line":1156},[63,1950,1951],{"class":91},"    Message msg;\n",[63,1953,1954],{"class":65,"line":1161},[63,1955,121],{"emptyLinePlaceholder":120},[63,1957,1958,1961,1963,1966,1969],{"class":65,"line":1181},[63,1959,1960],{"class":91},"    msg ",[63,1962,130],{"class":69},[63,1964,1965],{"class":91}," TextMessage{",[63,1967,1968],{"class":73},"\"Hello World\"",[63,1970,1930],{"class":91},[63,1972,1973,1975,1977,1979],{"class":65,"line":1188},[63,1974,504],{"class":87},[63,1976,169],{"class":91},[63,1978,290],{"class":87},[63,1980,1981],{"class":91},"(MessageHandler{}, msg);\n",[63,1983,1984],{"class":65,"line":1193},[63,1985,121],{"emptyLinePlaceholder":120},[63,1987,1988,1990,1992,1995,1998],{"class":65,"line":1202},[63,1989,1960],{"class":91},[63,1991,130],{"class":69},[63,1993,1994],{"class":91}," NumberMessage{",[63,1996,1997],{"class":133},"42",[63,1999,1930],{"class":91},[63,2001,2002,2004,2006,2008],{"class":65,"line":1601},[63,2003,504],{"class":87},[63,2005,169],{"class":91},[63,2007,290],{"class":87},[63,2009,1981],{"class":91},[63,2011,2012],{"class":65,"line":1606},[63,2013,121],{"emptyLinePlaceholder":120},[63,2015,2016,2018,2020],{"class":65,"line":1615},[63,2017,1960],{"class":91},[63,2019,130],{"class":69},[63,2021,2022],{"class":91}," QuitMessage{};\n",[63,2024,2026,2028,2030,2032],{"class":65,"line":2025},40,[63,2027,504],{"class":87},[63,2029,169],{"class":91},[63,2031,290],{"class":87},[63,2033,1981],{"class":91},[63,2035,2037],{"class":65,"line":2036},41,[63,2038,121],{"emptyLinePlaceholder":120},[63,2040,2042,2044,2046],{"class":65,"line":2041},42,[63,2043,748],{"class":69},[63,2045,751],{"class":133},[63,2047,538],{"class":91},[63,2049,2051],{"class":65,"line":2050},43,[63,2052,759],{"class":91},[16,2054,2055,765],{},[30,2056,764],{},[54,2058,2061],{"className":2059,"code":2060,"language":771},[769],"Text: Hello World\nNumber: 42\nQuit!\n",[20,2062,2060],{"__ignoreMap":59},[440,2064,2066,2069],{"id":2065},"stdvisit-与-visitor-机制",[20,2067,2068],{},"std::visit"," 与 Visitor 机制",[16,2071,2072],{},"上面的代码中：",[54,2074,2076],{"className":56,"code":2075,"language":58,"meta":59,"style":59},"std::visit(MessageHandler{}, msg);\n",[20,2077,2078],{"__ignoreMap":59},[63,2079,2080,2082,2084,2086],{"class":65,"line":66},[63,2081,88],{"class":87},[63,2083,169],{"class":91},[63,2085,290],{"class":87},[63,2087,1981],{"class":91},[16,2089,2090],{},"这一句刚开始看起来可能比较奇怪。",[16,2092,2093,2094,2096],{},"先记住 ",[20,2095,2068],{}," 最基本的形式：",[54,2098,2100],{"className":56,"code":2099,"language":58,"meta":59,"style":59},"std::visit(visitor, variant对象);\n",[20,2101,2102],{"__ignoreMap":59},[63,2103,2104,2106,2108,2110],{"class":65,"line":66},[63,2105,88],{"class":87},[63,2107,169],{"class":91},[63,2109,290],{"class":87},[63,2111,2112],{"class":91},"(visitor, variant对象);\n",[16,2114,2115],{},"其中：",[2117,2118,2119,2125,2131],"ul",{},[2120,2121,2122,2123],"li",{},"第二个参数是 ",[20,2124,5],{},[2120,2126,2127,2128],{},"第一个参数是一个",[30,2129,2130],{},"可调用对象（Callable）",[2120,2132,2133,2135,2136,2138],{},[20,2134,2068],{}," 会根据 ",[20,2137,824],{}," 当前保存的数据类型，调用对应的处理函数",[16,2140,2141],{},"例如：",[54,2143,2145],{"className":56,"code":2144,"language":58,"meta":59,"style":59},"Message msg;\n\nmsg = TextMessage{\"Hello World\"};\nstd::visit(MessageHandler{}, msg);\n",[20,2146,2147,2152,2156,2169],{"__ignoreMap":59},[63,2148,2149],{"class":65,"line":66},[63,2150,2151],{"class":91},"Message msg;\n",[63,2153,2154],{"class":65,"line":117},[63,2155,121],{"emptyLinePlaceholder":120},[63,2157,2158,2161,2163,2165,2167],{"class":65,"line":124},[63,2159,2160],{"class":91},"msg ",[63,2162,130],{"class":69},[63,2164,1965],{"class":91},[63,2166,1968],{"class":73},[63,2168,1930],{"class":91},[63,2170,2171,2173,2175,2177],{"class":65,"line":144},[63,2172,88],{"class":87},[63,2174,169],{"class":91},[63,2176,290],{"class":87},[63,2178,1981],{"class":91},[16,2180,2181,2182,2185],{},"此时 ",[20,2183,2184],{},"msg"," 内部保存的是：",[54,2187,2189],{"className":56,"code":2188,"language":58,"meta":59,"style":59},"TextMessage\n",[20,2190,2191],{"__ignoreMap":59},[63,2192,2193],{"class":65,"line":66},[63,2194,2188],{"class":91},[16,2196,2197,2198,2200,2201,2203,2204,2207],{},"因此 ",[20,2199,2068],{}," 会把这个 ",[20,2202,1729],{}," 取出来，并交给 ",[20,2205,2206],{},"MessageHandler"," 处理。",[2209,2210],"hr",{},[2212,2213,2215,2218],"h4",{"id":2214},"messagehandler-是什么",[20,2216,2217],{},"MessageHandler{}"," 是什么？",[16,2220,2221],{},"这里：",[54,2223,2225],{"className":56,"code":2224,"language":58,"meta":59,"style":59},"MessageHandler{}\n",[20,2226,2227],{"__ignoreMap":59},[63,2228,2229],{"class":65,"line":66},[63,2230,2224],{"class":91},[16,2232,2233],{},"不是函数，也不是特殊语法。",[16,2235,2236,2237,2239],{},"它就是创建了一个临时的 ",[20,2238,2206],{}," 对象。",[16,2241,2141],{},[54,2243,2245],{"className":56,"code":2244,"language":58,"meta":59,"style":59},"MessageHandler handler;\n",[20,2246,2247],{"__ignoreMap":59},[63,2248,2249],{"class":65,"line":66},[63,2250,2244],{"class":91},[16,2252,2253],{},"和：",[54,2255,2256],{"className":56,"code":2224,"language":58,"meta":59,"style":59},[20,2257,2258],{"__ignoreMap":59},[63,2259,2260],{"class":65,"line":66},[63,2261,2224],{"class":91},[16,2263,2264],{},"创建的对象类型是一样的，只不过后者是临时对象。",[16,2266,2267],{},"因此：",[54,2269,2270],{"className":56,"code":2075,"language":58,"meta":59,"style":59},[20,2271,2272],{"__ignoreMap":59},[63,2273,2274,2276,2278,2280],{"class":65,"line":66},[63,2275,88],{"class":87},[63,2277,169],{"class":91},[63,2279,290],{"class":87},[63,2281,1981],{"class":91},[16,2283,2284],{},"也可以写成：",[54,2286,2288],{"className":56,"code":2287,"language":58,"meta":59,"style":59},"MessageHandler handler;\nstd::visit(handler, msg);\n",[20,2289,2290,2294],{"__ignoreMap":59},[63,2291,2292],{"class":65,"line":66},[63,2293,2244],{"class":91},[63,2295,2296,2298,2300,2302],{"class":65,"line":117},[63,2297,88],{"class":87},[63,2299,169],{"class":91},[63,2301,290],{"class":87},[63,2303,2304],{"class":91},"(handler, msg);\n",[2209,2306],{},[2212,2308,2310],{"id":2309},"为什么一个结构体可以像函数一样调用","为什么一个结构体可以像函数一样调用？",[16,2312,2313,2314,2316],{},"因为 ",[20,2315,2206],{}," 重载了：",[54,2318,2320],{"className":56,"code":2319,"language":58,"meta":59,"style":59},"operator()\n",[20,2321,2322],{"__ignoreMap":59},[63,2323,2324],{"class":65,"line":66},[63,2325,2319],{"class":91},[16,2327,2141],{},[54,2329,2331],{"className":56,"code":2330,"language":58,"meta":59,"style":59},"struct MessageHandler\n{\n    void operator()(const TextMessage& msg) const\n    {\n        std::cout \u003C\u003C \"Text: \" \u003C\u003C msg.text \u003C\u003C \"\\n\";\n    }\n};\n",[20,2332,2333,2339,2343,2365,2369,2393,2397],{"__ignoreMap":59},[63,2334,2335,2337],{"class":65,"line":66},[63,2336,1668],{"class":69},[63,2338,1758],{"class":87},[63,2340,2341],{"class":65,"line":117},[63,2342,494],{"class":91},[63,2344,2345,2347,2349,2351,2353,2355,2357,2359,2361,2363],{"class":65,"line":124},[63,2346,1767],{"class":69},[63,2348,1770],{"class":69},[63,2350,1773],{"class":87},[63,2352,175],{"class":91},[63,2354,817],{"class":69},[63,2356,1671],{"class":87},[63,2358,266],{"class":69},[63,2360,1784],{"class":299},[63,2362,1787],{"class":91},[63,2364,1790],{"class":69},[63,2366,2367],{"class":65,"line":144},[63,2368,894],{"class":91},[63,2370,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391],{"class":65,"line":159},[63,2372,899],{"class":87},[63,2374,545],{"class":91},[63,2376,548],{"class":69},[63,2378,1805],{"class":73},[63,2380,554],{"class":69},[63,2382,1810],{"class":91},[63,2384,548],{"class":69},[63,2386,572],{"class":73},[63,2388,575],{"class":133},[63,2390,578],{"class":73},[63,2392,538],{"class":91},[63,2394,2395],{"class":65,"line":187},[63,2396,928],{"class":91},[63,2398,2399],{"class":65,"line":192},[63,2400,1930],{"class":91},[16,2402,2403],{},"创建对象以后：",[54,2405,2406],{"className":56,"code":2244,"language":58,"meta":59,"style":59},[20,2407,2408],{"__ignoreMap":59},[63,2409,2410],{"class":65,"line":66},[63,2411,2244],{"class":91},[16,2413,2414],{},"就可以直接这样调用：",[54,2416,2418],{"className":56,"code":2417,"language":58,"meta":59,"style":59},"handler(TextMessage{\"Hello\"});\n",[20,2419,2420],{"__ignoreMap":59},[63,2421,2422,2425,2428,2431],{"class":65,"line":66},[63,2423,2424],{"class":87},"handler",[63,2426,2427],{"class":91},"(TextMessage{",[63,2429,2430],{"class":73},"\"Hello\"",[63,2432,2433],{"class":91},"});\n",[16,2435,2436],{},"看起来像是在调用一个函数。",[16,2438,2439],{},"实际上等价于：",[54,2441,2443],{"className":56,"code":2442,"language":58,"meta":59,"style":59},"handler.operator()(TextMessage{\"Hello\"});\n",[20,2444,2445],{"__ignoreMap":59},[63,2446,2447,2450,2453,2456,2458],{"class":65,"line":66},[63,2448,2449],{"class":91},"handler.",[63,2451,2452],{"class":87},"operator",[63,2454,2455],{"class":91},"()(TextMessage{",[63,2457,2430],{"class":73},[63,2459,2433],{"class":91},[16,2461,2462],{},"所以这种重载了：",[54,2464,2465],{"className":56,"code":2319,"language":58,"meta":59,"style":59},[20,2466,2467],{"__ignoreMap":59},[63,2468,2469],{"class":65,"line":66},[63,2470,2319],{"class":91},[16,2472,2473],{},"的对象也叫：",[16,2475,2476,33],{},[30,2477,2478],{},"函数对象（Function Object \u002F Functor）",[2209,2480],{},[2212,2482,2484,2485,2488],{"id":2483},"为什么这里有三个-operator","为什么这里有三个 ",[20,2486,2487],{},"operator()","？",[16,2490,2491],{},"因为：",[54,2493,2495],{"className":56,"code":2494,"language":58,"meta":59,"style":59},"using Message =\n    std::variant\u003CTextMessage, NumberMessage, QuitMessage>;\n",[20,2496,2497,2506],{"__ignoreMap":59},[63,2498,2499,2501,2503],{"class":65,"line":66},[63,2500,1712],{"class":69},[63,2502,1715],{"class":87},[63,2504,2505],{"class":69}," =\n",[63,2507,2508,2510,2512,2514,2517,2519],{"class":65,"line":117},[63,2509,504],{"class":87},[63,2511,92],{"class":91},[63,2513,216],{"class":69},[63,2515,2516],{"class":91},"TextMessage, NumberMessage, QuitMessage",[63,2518,111],{"class":69},[63,2520,538],{"class":91},[16,2522,2523,2526],{},[20,2524,2525],{},"Message"," 可能保存三种不同的数据：",[54,2528,2530],{"className":56,"code":2529,"language":58,"meta":59,"style":59},"TextMessage\nNumberMessage\nQuitMessage\n",[20,2531,2532,2536,2541],{"__ignoreMap":59},[63,2533,2534],{"class":65,"line":66},[63,2535,2188],{"class":91},[63,2537,2538],{"class":65,"line":117},[63,2539,2540],{"class":91},"NumberMessage\n",[63,2542,2543],{"class":65,"line":124},[63,2544,2545],{"class":91},"QuitMessage\n",[16,2547,2197,2548,2550],{},[20,2549,2206],{}," 分别准备了三个处理函数：",[54,2552,2554],{"className":56,"code":2553,"language":58,"meta":59,"style":59},"void operator()(const TextMessage& msg) const\n{\n    std::cout \u003C\u003C \"Text: \" \u003C\u003C msg.text \u003C\u003C \"\\n\";\n}\n",[20,2555,2556,2578,2582,2606],{"__ignoreMap":59},[63,2557,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576],{"class":65,"line":66},[63,2559,809],{"class":69},[63,2561,1770],{"class":69},[63,2563,1773],{"class":87},[63,2565,175],{"class":91},[63,2567,817],{"class":69},[63,2569,1671],{"class":87},[63,2571,266],{"class":69},[63,2573,1784],{"class":299},[63,2575,1787],{"class":91},[63,2577,1790],{"class":69},[63,2579,2580],{"class":65,"line":117},[63,2581,494],{"class":91},[63,2583,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604],{"class":65,"line":124},[63,2585,504],{"class":87},[63,2587,545],{"class":91},[63,2589,548],{"class":69},[63,2591,1805],{"class":73},[63,2593,554],{"class":69},[63,2595,1810],{"class":91},[63,2597,548],{"class":69},[63,2599,572],{"class":73},[63,2601,575],{"class":133},[63,2603,578],{"class":73},[63,2605,538],{"class":91},[63,2607,2608],{"class":65,"line":144},[63,2609,759],{"class":91},[16,2611,2612],{},"处理：",[54,2614,2615],{"className":56,"code":2188,"language":58,"meta":59,"style":59},[20,2616,2617],{"__ignoreMap":59},[63,2618,2619],{"class":65,"line":66},[63,2620,2188],{"class":91},[2209,2622],{},[54,2624,2626],{"className":56,"code":2625,"language":58,"meta":59,"style":59},"void operator()(const NumberMessage& msg) const\n{\n    std::cout \u003C\u003C \"Number: \" \u003C\u003C msg.number \u003C\u003C \"\\n\";\n}\n",[20,2627,2628,2650,2654,2678],{"__ignoreMap":59},[63,2629,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648],{"class":65,"line":66},[63,2631,809],{"class":69},[63,2633,1770],{"class":69},[63,2635,1773],{"class":87},[63,2637,175],{"class":91},[63,2639,817],{"class":69},[63,2641,1686],{"class":87},[63,2643,266],{"class":69},[63,2645,1784],{"class":299},[63,2647,1787],{"class":91},[63,2649,1790],{"class":69},[63,2651,2652],{"class":65,"line":117},[63,2653,494],{"class":91},[63,2655,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676],{"class":65,"line":124},[63,2657,504],{"class":87},[63,2659,545],{"class":91},[63,2661,548],{"class":69},[63,2663,1861],{"class":73},[63,2665,554],{"class":69},[63,2667,1866],{"class":91},[63,2669,548],{"class":69},[63,2671,572],{"class":73},[63,2673,575],{"class":133},[63,2675,578],{"class":73},[63,2677,538],{"class":91},[63,2679,2680],{"class":65,"line":144},[63,2681,759],{"class":91},[16,2683,2612],{},[54,2685,2686],{"className":56,"code":2540,"language":58,"meta":59,"style":59},[20,2687,2688],{"__ignoreMap":59},[63,2689,2690],{"class":65,"line":66},[63,2691,2540],{"class":91},[2209,2693],{},[54,2695,2697],{"className":56,"code":2696,"language":58,"meta":59,"style":59},"void operator()(const QuitMessage&) const\n{\n    std::cout \u003C\u003C \"Quit!\\n\";\n}\n",[20,2698,2699,2719,2723,2739],{"__ignoreMap":59},[63,2700,2701,2703,2705,2707,2709,2711,2713,2715,2717],{"class":65,"line":66},[63,2702,809],{"class":69},[63,2704,1770],{"class":69},[63,2706,1773],{"class":87},[63,2708,175],{"class":91},[63,2710,817],{"class":69},[63,2712,1700],{"class":87},[63,2714,266],{"class":69},[63,2716,1787],{"class":91},[63,2718,1790],{"class":69},[63,2720,2721],{"class":65,"line":117},[63,2722,494],{"class":91},[63,2724,2725,2727,2729,2731,2733,2735,2737],{"class":65,"line":124},[63,2726,504],{"class":87},[63,2728,545],{"class":91},[63,2730,548],{"class":69},[63,2732,1915],{"class":73},[63,2734,575],{"class":133},[63,2736,578],{"class":73},[63,2738,538],{"class":91},[63,2740,2741],{"class":65,"line":144},[63,2742,759],{"class":91},[16,2744,2612],{},[54,2746,2747],{"className":56,"code":2545,"language":58,"meta":59,"style":59},[20,2748,2749],{"__ignoreMap":59},[63,2750,2751],{"class":65,"line":66},[63,2752,2545],{"class":91},[16,2754,2755],{},"它们虽然函数名都是：",[54,2757,2758],{"className":56,"code":2319,"language":58,"meta":59,"style":59},[20,2759,2760],{"__ignoreMap":59},[63,2761,2762],{"class":65,"line":66},[63,2763,2319],{"class":91},[16,2765,2766,2767,33],{},"但是参数类型不同，因此属于",[30,2768,2769],{},"函数重载",[2209,2771],{},[2212,2773,2775,2777],{"id":2774},"stdvisit-到底做了什么",[20,2776,2068],{}," 到底做了什么？",[16,2779,2141],{},[54,2781,2783],{"className":56,"code":2782,"language":58,"meta":59,"style":59},"msg = TextMessage{\"Hello World\"};\n\nstd::visit(MessageHandler{}, msg);\n",[20,2784,2785,2797,2801],{"__ignoreMap":59},[63,2786,2787,2789,2791,2793,2795],{"class":65,"line":66},[63,2788,2160],{"class":91},[63,2790,130],{"class":69},[63,2792,1965],{"class":91},[63,2794,1968],{"class":73},[63,2796,1930],{"class":91},[63,2798,2799],{"class":65,"line":117},[63,2800,121],{"emptyLinePlaceholder":120},[63,2802,2803,2805,2807,2809],{"class":65,"line":124},[63,2804,88],{"class":87},[63,2806,169],{"class":91},[63,2808,290],{"class":87},[63,2810,1981],{"class":91},[16,2812,2181,2813,2815],{},[20,2814,2184],{}," 保存的是：",[54,2817,2818],{"className":56,"code":2188,"language":58,"meta":59,"style":59},[20,2819,2820],{"__ignoreMap":59},[63,2821,2822],{"class":65,"line":66},[63,2823,2188],{"class":91},[16,2825,2826,2827,2829],{},"可以粗略理解为 ",[20,2828,2068],{}," 做了：",[54,2831,2833],{"className":56,"code":2832,"language":58,"meta":59,"style":59},"MessageHandler{}(TextMessage{\"Hello World\"});\n",[20,2834,2835],{"__ignoreMap":59},[63,2836,2837,2840,2842],{"class":65,"line":66},[63,2838,2839],{"class":91},"MessageHandler{}(TextMessage{",[63,2841,1968],{"class":73},[63,2843,2433],{"class":91},[16,2845,2846],{},"于是编译器找到：",[54,2848,2850],{"className":56,"code":2849,"language":58,"meta":59,"style":59},"void operator()(const TextMessage& msg) const\n",[20,2851,2852],{"__ignoreMap":59},[63,2853,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872],{"class":65,"line":66},[63,2855,809],{"class":69},[63,2857,1770],{"class":69},[63,2859,1773],{"class":87},[63,2861,175],{"class":91},[63,2863,817],{"class":69},[63,2865,1671],{"class":87},[63,2867,266],{"class":69},[63,2869,1784],{"class":299},[63,2871,1787],{"class":91},[63,2873,1790],{"class":69},[16,2875,2876],{},"最终输出：",[54,2878,2881],{"className":2879,"code":2880,"language":771,"meta":59},[769],"Text: Hello World\n",[20,2882,2880],{"__ignoreMap":59},[2209,2884],{},[16,2886,2887],{},"再例如：",[54,2889,2891],{"className":56,"code":2890,"language":58,"meta":59,"style":59},"msg = NumberMessage{42};\n\nstd::visit(MessageHandler{}, msg);\n",[20,2892,2893,2905,2909],{"__ignoreMap":59},[63,2894,2895,2897,2899,2901,2903],{"class":65,"line":66},[63,2896,2160],{"class":91},[63,2898,130],{"class":69},[63,2900,1994],{"class":91},[63,2902,1997],{"class":133},[63,2904,1930],{"class":91},[63,2906,2907],{"class":65,"line":117},[63,2908,121],{"emptyLinePlaceholder":120},[63,2910,2911,2913,2915,2917],{"class":65,"line":124},[63,2912,88],{"class":87},[63,2914,169],{"class":91},[63,2916,290],{"class":87},[63,2918,1981],{"class":91},[16,2920,2921],{},"可以粗略理解成：",[54,2923,2925],{"className":56,"code":2924,"language":58,"meta":59,"style":59},"MessageHandler{}(NumberMessage{42});\n",[20,2926,2927],{"__ignoreMap":59},[63,2928,2929,2932,2934],{"class":65,"line":66},[63,2930,2931],{"class":91},"MessageHandler{}(NumberMessage{",[63,2933,1997],{"class":133},[63,2935,2433],{"class":91},[16,2937,2938],{},"于是调用：",[54,2940,2942],{"className":56,"code":2941,"language":58,"meta":59,"style":59},"void operator()(const NumberMessage& msg) const\n",[20,2943,2944],{"__ignoreMap":59},[63,2945,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964],{"class":65,"line":66},[63,2947,809],{"class":69},[63,2949,1770],{"class":69},[63,2951,1773],{"class":87},[63,2953,175],{"class":91},[63,2955,817],{"class":69},[63,2957,1686],{"class":87},[63,2959,266],{"class":69},[63,2961,1784],{"class":299},[63,2963,1787],{"class":91},[63,2965,1790],{"class":69},[16,2967,2968],{},"输出：",[54,2970,2973],{"className":2971,"code":2972,"language":771,"meta":59},[769],"Number: 42\n",[20,2974,2972],{"__ignoreMap":59},[2209,2976],{},[16,2978,2979],{},"最后：",[54,2981,2983],{"className":56,"code":2982,"language":58,"meta":59,"style":59},"msg = QuitMessage{};\n\nstd::visit(MessageHandler{}, msg);\n",[20,2984,2985,2993,2997],{"__ignoreMap":59},[63,2986,2987,2989,2991],{"class":65,"line":66},[63,2988,2160],{"class":91},[63,2990,130],{"class":69},[63,2992,2022],{"class":91},[63,2994,2995],{"class":65,"line":117},[63,2996,121],{"emptyLinePlaceholder":120},[63,2998,2999,3001,3003,3005],{"class":65,"line":124},[63,3000,88],{"class":87},[63,3002,169],{"class":91},[63,3004,290],{"class":87},[63,3006,1981],{"class":91},[16,3008,3009],{},"则会选择：",[54,3011,3013],{"className":56,"code":3012,"language":58,"meta":59,"style":59},"void operator()(const QuitMessage&) const\n",[20,3014,3015],{"__ignoreMap":59},[63,3016,3017,3019,3021,3023,3025,3027,3029,3031,3033],{"class":65,"line":66},[63,3018,809],{"class":69},[63,3020,1770],{"class":69},[63,3022,1773],{"class":87},[63,3024,175],{"class":91},[63,3026,817],{"class":69},[63,3028,1700],{"class":87},[63,3030,266],{"class":69},[63,3032,1787],{"class":91},[63,3034,1790],{"class":69},[16,3036,2968],{},[54,3038,3041],{"className":3039,"code":3040,"language":771,"meta":59},[769],"Quit!\n",[20,3042,3040],{"__ignoreMap":59},[16,3044,3045],{},"整个过程可以理解为：",[54,3047,3050],{"className":3048,"code":3049,"language":771,"meta":59},[769],"                         std::variant\n                              │\n              ┌───────────────┼───────────────┐\n              │               │               │\n       TextMessage      NumberMessage     QuitMessage\n              │               │               │\n              ▼               ▼               ▼\n operator(TextMessage) operator(NumberMessage) operator(QuitMessage)\n",[20,3051,3049],{"__ignoreMap":59},[16,3053,3054,3056],{},[20,3055,2068],{}," 的作用就是：",[3058,3059,3060],"blockquote",{},[16,3061,3062,3063,3065],{},"查看 ",[20,3064,824],{}," 当前保存的是哪一种类型，然后自动调用 visitor 中能够处理这个类型的函数。",[2209,3067],{},[2212,3069,3071,3073],{"id":3070},"stdvisit-第一个参数必须是结构体吗",[20,3072,2068],{}," 第一个参数必须是结构体吗？",[16,3075,3076],{},"不是。",[16,3078,3079,3081],{},[20,3080,2068],{}," 第一个参数本质上只要求是一个：",[16,3083,3084,33],{},[30,3085,2130],{},[16,3087,3088],{},"也就是说，只要一个东西能够像下面这样调用：",[54,3090,3092],{"className":56,"code":3091,"language":58,"meta":59,"style":59},"对象(参数);\n",[20,3093,3094],{"__ignoreMap":59},[63,3095,3096],{"class":65,"line":66},[63,3097,3091],{"class":91},[16,3099,3100],{},"就可以作为 visitor。",[16,3102,3103],{},"常见的可调用对象包括：",[54,3105,3108],{"className":3106,"code":3107,"language":771,"meta":59},[769],"普通函数\nLambda\n函数对象（重载 operator() 的 class \u002F struct）\nstd::function\n",[20,3109,3107],{"__ignoreMap":59},[16,3111,3112],{},"上面的例子使用的是：",[54,3114,3115],{"className":56,"code":2224,"language":58,"meta":59,"style":59},[20,3116,3117],{"__ignoreMap":59},[63,3118,3119],{"class":65,"line":66},[63,3120,2224],{"class":91},[16,3122,3123],{},"它属于：",[54,3125,3128],{"className":3126,"code":3127,"language":771,"meta":59},[769],"结构体对象\n    ↓\n重载 operator()\n    ↓\n函数对象 Functor\n    ↓\n可以作为 std::visit 的 Visitor\n",[20,3129,3127],{"__ignoreMap":59},[2209,3131],{},[2212,3133,3135],{"id":3134},"lambda-为什么也能作为-visitor","Lambda 为什么也能作为 Visitor？",[16,3137,2141],{},[54,3139,3141],{"className":56,"code":3140,"language":58,"meta":59,"style":59},"std::visit(\n    [](const auto& msg)\n    {\n        std::cout \u003C\u003C \"收到一条消息\\n\";\n    },\n    msg\n);\n",[20,3142,3143,3154,3167,3171,3188,3193,3198],{"__ignoreMap":59},[63,3144,3145,3147,3149,3151],{"class":65,"line":66},[63,3146,88],{"class":87},[63,3148,169],{"class":91},[63,3150,290],{"class":87},[63,3152,3153],{"class":91},"(\n",[63,3155,3156,3159,3161,3163,3165],{"class":65,"line":117},[63,3157,3158],{"class":91},"    [](",[63,3160,817],{"class":69},[63,3162,1306],{"class":69},[63,3164,1784],{"class":299},[63,3166,850],{"class":91},[63,3168,3169],{"class":65,"line":124},[63,3170,894],{"class":91},[63,3172,3173,3175,3177,3179,3182,3184,3186],{"class":65,"line":144},[63,3174,899],{"class":87},[63,3176,545],{"class":91},[63,3178,548],{"class":69},[63,3180,3181],{"class":73}," \"收到一条消息",[63,3183,575],{"class":133},[63,3185,578],{"class":73},[63,3187,538],{"class":91},[63,3189,3190],{"class":65,"line":159},[63,3191,3192],{"class":91},"    },\n",[63,3194,3195],{"class":65,"line":187},[63,3196,3197],{"class":91},"    msg\n",[63,3199,3200],{"class":65,"line":192},[63,3201,652],{"class":91},[16,3203,3204],{},"这里第一个参数就是一个 Lambda。",[16,3206,3207],{},"Lambda 本身也是一种可调用对象。",[16,3209,2141],{},[54,3211,3213],{"className":56,"code":3212,"language":58,"meta":59,"style":59},"auto f = [](int x)\n{\n    std::cout \u003C\u003C x \u003C\u003C \"\\n\";\n};\n\nf(10);\n",[20,3214,3215,3234,3238,3259,3263,3267],{"__ignoreMap":59},[63,3216,3217,3220,3223,3225,3227,3229,3232],{"class":65,"line":66},[63,3218,3219],{"class":69},"auto",[63,3221,3222],{"class":91}," f ",[63,3224,130],{"class":69},[63,3226,1301],{"class":91},[63,3228,201],{"class":69},[63,3230,3231],{"class":299}," x",[63,3233,850],{"class":91},[63,3235,3236],{"class":65,"line":117},[63,3237,494],{"class":91},[63,3239,3240,3242,3244,3246,3249,3251,3253,3255,3257],{"class":65,"line":124},[63,3241,504],{"class":87},[63,3243,545],{"class":91},[63,3245,548],{"class":69},[63,3247,3248],{"class":91}," x ",[63,3250,548],{"class":69},[63,3252,572],{"class":73},[63,3254,575],{"class":133},[63,3256,578],{"class":73},[63,3258,538],{"class":91},[63,3260,3261],{"class":65,"line":144},[63,3262,1930],{"class":91},[63,3264,3265],{"class":65,"line":159},[63,3266,121],{"emptyLinePlaceholder":120},[63,3268,3269,3272,3274,3277],{"class":65,"line":187},[63,3270,3271],{"class":87},"f",[63,3273,175],{"class":91},[63,3275,3276],{"class":133},"10",[63,3278,652],{"class":91},[16,3280,3281],{},"能够像函数一样调用：",[54,3283,3285],{"className":56,"code":3284,"language":58,"meta":59,"style":59},"f(10);\n",[20,3286,3287],{"__ignoreMap":59},[63,3288,3289,3291,3293,3295],{"class":65,"line":66},[63,3290,3271],{"class":87},[63,3292,175],{"class":91},[63,3294,3276],{"class":133},[63,3296,652],{"class":91},[16,3298,3299],{},"因此它也可以传给：",[54,3301,3303],{"className":56,"code":3302,"language":58,"meta":59,"style":59},"std::visit\n",[20,3304,3305],{"__ignoreMap":59},[63,3306,3307,3309],{"class":65,"line":66},[63,3308,88],{"class":87},[63,3310,3311],{"class":91},"::visit\n",[16,3313,3314],{},"实际上，可以把 Lambda 粗略理解成编译器自动生成了一个匿名的函数对象：",[54,3316,3318],{"className":56,"code":3317,"language":58,"meta":59,"style":59},"struct 某个匿名类型\n{\n    void operator()(int x) const\n    {\n        std::cout \u003C\u003C x \u003C\u003C \"\\n\";\n    }\n};\n",[20,3319,3320,3327,3331,3349,3353,3373,3377],{"__ignoreMap":59},[63,3321,3322,3324],{"class":65,"line":66},[63,3323,1668],{"class":69},[63,3325,3326],{"class":91}," 某个匿名类型\n",[63,3328,3329],{"class":65,"line":117},[63,3330,494],{"class":91},[63,3332,3333,3335,3337,3339,3341,3343,3345,3347],{"class":65,"line":124},[63,3334,1767],{"class":69},[63,3336,1770],{"class":69},[63,3338,1773],{"class":87},[63,3340,175],{"class":91},[63,3342,201],{"class":69},[63,3344,3231],{"class":299},[63,3346,1787],{"class":91},[63,3348,1790],{"class":69},[63,3350,3351],{"class":65,"line":144},[63,3352,894],{"class":91},[63,3354,3355,3357,3359,3361,3363,3365,3367,3369,3371],{"class":65,"line":159},[63,3356,899],{"class":87},[63,3358,545],{"class":91},[63,3360,548],{"class":69},[63,3362,3248],{"class":91},[63,3364,548],{"class":69},[63,3366,572],{"class":73},[63,3368,575],{"class":133},[63,3370,578],{"class":73},[63,3372,538],{"class":91},[63,3374,3375],{"class":65,"line":187},[63,3376,928],{"class":91},[63,3378,3379],{"class":65,"line":192},[63,3380,1930],{"class":91},[16,3382,3383],{},"所以从思想上来说：",[54,3385,3387],{"className":56,"code":3386,"language":58,"meta":59,"style":59},"Lambda\n",[20,3388,3389],{"__ignoreMap":59},[63,3390,3391],{"class":65,"line":66},[63,3392,3386],{"class":91},[16,3394,2253],{},[54,3396,3398],{"className":56,"code":3397,"language":58,"meta":59,"style":59},"重载了 operator() 的 struct\u002Fclass\n",[20,3399,3400],{"__ignoreMap":59},[63,3401,3402,3405,3407],{"class":65,"line":66},[63,3403,3404],{"class":91},"重载了 operator() 的 ",[63,3406,1668],{"class":69},[63,3408,3409],{"class":91},"\u002Fclass\n",[16,3411,3412],{},"非常相似。",[2209,3414],{},[2212,3416,3418],{"id":3417},"为什么这个例子更适合用结构体-visitor","为什么这个例子更适合用结构体 Visitor？",[16,3420,3421],{},"如果只有一种简单操作，Lambda 很方便：",[54,3423,3425],{"className":56,"code":3424,"language":58,"meta":59,"style":59},"[](const auto& value)\n{\n    \u002F\u002F ...\n}\n",[20,3426,3427,3441,3445,3450],{"__ignoreMap":59},[63,3428,3429,3432,3434,3436,3439],{"class":65,"line":66},[63,3430,3431],{"class":91},"[](",[63,3433,817],{"class":69},[63,3435,1306],{"class":69},[63,3437,3438],{"class":299}," value",[63,3440,850],{"class":91},[63,3442,3443],{"class":65,"line":117},[63,3444,494],{"class":91},[63,3446,3447],{"class":65,"line":124},[63,3448,3449],{"class":140},"    \u002F\u002F ...\n",[63,3451,3452],{"class":65,"line":144},[63,3453,759],{"class":91},[16,3455,3456],{},"但是这里需要针对不同类型执行完全不同的逻辑：",[54,3458,3459],{"className":56,"code":2529,"language":58,"meta":59,"style":59},[20,3460,3461,3465,3469],{"__ignoreMap":59},[63,3462,3463],{"class":65,"line":66},[63,3464,2188],{"class":91},[63,3466,3467],{"class":65,"line":117},[63,3468,2540],{"class":91},[63,3470,3471],{"class":65,"line":124},[63,3472,2545],{"class":91},[16,3474,3475,3476,3478],{},"使用多个 ",[20,3477,2487],{}," 重载会非常直观：",[54,3480,3482],{"className":56,"code":3481,"language":58,"meta":59,"style":59},"struct MessageHandler\n{\n    void operator()(const TextMessage& msg) const\n    {\n        \u002F\u002F 处理文本消息\n    }\n\n    void operator()(const NumberMessage& msg) const\n    {\n        \u002F\u002F 处理数字消息\n    }\n\n    void operator()(const QuitMessage&) const\n    {\n        \u002F\u002F 处理退出消息\n    }\n};\n",[20,3483,3484,3490,3494,3516,3520,3525,3529,3533,3555,3559,3564,3568,3572,3592,3596,3601,3605],{"__ignoreMap":59},[63,3485,3486,3488],{"class":65,"line":66},[63,3487,1668],{"class":69},[63,3489,1758],{"class":87},[63,3491,3492],{"class":65,"line":117},[63,3493,494],{"class":91},[63,3495,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514],{"class":65,"line":124},[63,3497,1767],{"class":69},[63,3499,1770],{"class":69},[63,3501,1773],{"class":87},[63,3503,175],{"class":91},[63,3505,817],{"class":69},[63,3507,1671],{"class":87},[63,3509,266],{"class":69},[63,3511,1784],{"class":299},[63,3513,1787],{"class":91},[63,3515,1790],{"class":69},[63,3517,3518],{"class":65,"line":144},[63,3519,894],{"class":91},[63,3521,3522],{"class":65,"line":159},[63,3523,3524],{"class":140},"        \u002F\u002F 处理文本消息\n",[63,3526,3527],{"class":65,"line":187},[63,3528,928],{"class":91},[63,3530,3531],{"class":65,"line":192},[63,3532,121],{"emptyLinePlaceholder":120},[63,3534,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553],{"class":65,"line":198},[63,3536,1767],{"class":69},[63,3538,1770],{"class":69},[63,3540,1773],{"class":87},[63,3542,175],{"class":91},[63,3544,817],{"class":69},[63,3546,1686],{"class":87},[63,3548,266],{"class":69},[63,3550,1784],{"class":299},[63,3552,1787],{"class":91},[63,3554,1790],{"class":69},[63,3556,3557],{"class":65,"line":224},[63,3558,894],{"class":91},[63,3560,3561],{"class":65,"line":229},[63,3562,3563],{"class":140},"        \u002F\u002F 处理数字消息\n",[63,3565,3566],{"class":65,"line":235},[63,3567,928],{"class":91},[63,3569,3570],{"class":65,"line":272},[63,3571,121],{"emptyLinePlaceholder":120},[63,3573,3574,3576,3578,3580,3582,3584,3586,3588,3590],{"class":65,"line":277},[63,3575,1767],{"class":69},[63,3577,1770],{"class":69},[63,3579,1773],{"class":87},[63,3581,175],{"class":91},[63,3583,817],{"class":69},[63,3585,1700],{"class":87},[63,3587,266],{"class":69},[63,3589,1787],{"class":91},[63,3591,1790],{"class":69},[63,3593,3594],{"class":65,"line":283},[63,3595,894],{"class":91},[63,3597,3598],{"class":65,"line":306},[63,3599,3600],{"class":140},"        \u002F\u002F 处理退出消息\n",[63,3602,3603],{"class":65,"line":311},[63,3604,928],{"class":91},[63,3606,3607],{"class":65,"line":317},[63,3608,1930],{"class":91},[16,3610,3611],{},"这样每种消息类型都有自己独立的处理逻辑。",[2209,3613],{},[2212,3615,3616],{"id":3616},"核心理解",[16,3618,3619],{},"可以把：",[54,3621,3622],{"className":56,"code":2075,"language":58,"meta":59,"style":59},[20,3623,3624],{"__ignoreMap":59},[63,3625,3626,3628,3630,3632],{"class":65,"line":66},[63,3627,88],{"class":87},[63,3629,169],{"class":91},[63,3631,290],{"class":87},[63,3633,1981],{"class":91},[16,3635,3636],{},"拆成两个部分理解。",[16,3638,3639],{},"首先：",[54,3641,3642],{"className":56,"code":2224,"language":58,"meta":59,"style":59},[20,3643,3644],{"__ignoreMap":59},[63,3645,3646],{"class":65,"line":66},[63,3647,2224],{"class":91},[16,3649,3650],{},"表示：",[54,3652,3655],{"className":3653,"code":3654,"language":771,"meta":59},[769],"创建一个 MessageHandler 临时对象\n",[20,3656,3654],{"__ignoreMap":59},[16,3658,3659],{},"由于它重载了：",[54,3661,3662],{"className":56,"code":2319,"language":58,"meta":59,"style":59},[20,3663,3664],{"__ignoreMap":59},[63,3665,3666],{"class":65,"line":66},[63,3667,2319],{"class":91},[16,3669,3670],{},"所以它是一个可调用对象。",[16,3672,3673],{},"然后：",[54,3675,3677],{"className":56,"code":3676,"language":58,"meta":59,"style":59},"std::visit(..., msg);\n",[20,3678,3679],{"__ignoreMap":59},[63,3680,3681,3683,3685,3687],{"class":65,"line":66},[63,3682,88],{"class":87},[63,3684,169],{"class":91},[63,3686,290],{"class":87},[63,3688,3689],{"class":91},"(..., msg);\n",[16,3691,3692],{},"负责：",[54,3694,3697],{"className":3695,"code":3696,"language":771,"meta":59},[769],"查看 msg 当前保存的类型\n        ↓\n取出对应的数据\n        ↓\n调用 MessageHandler 对应的 operator()\n",[20,3698,3696],{"__ignoreMap":59},[16,3700,2267],{},[54,3702,3703],{"className":56,"code":2075,"language":58,"meta":59,"style":59},[20,3704,3705],{"__ignoreMap":59},[63,3706,3707,3709,3711,3713],{"class":65,"line":66},[63,3708,88],{"class":87},[63,3710,169],{"class":91},[63,3712,290],{"class":87},[63,3714,1981],{"class":91},[16,3716,3717],{},"可以概括成一句话：",[3058,3719,3720],{},[16,3721,3722,3723,3725,3726,3728,3729,3731],{},"根据 ",[20,3724,2184],{}," 当前保存的数据类型，让 ",[20,3727,2206],{}," 自动选择对应的 ",[20,3730,2487],{}," 进行处理。",[16,3733,3734],{},"也可以记成：",[54,3736,3738],{"className":56,"code":3737,"language":58,"meta":59,"style":59},"std::visit(visitor, variant);\n",[20,3739,3740],{"__ignoreMap":59},[63,3741,3742,3744,3746,3748],{"class":65,"line":66},[63,3743,88],{"class":87},[63,3745,169],{"class":91},[63,3747,290],{"class":87},[63,3749,3750],{"class":91},"(visitor, variant);\n",[16,3752,3753],{},"即：",[54,3755,3758],{"className":3756,"code":3757,"language":771,"meta":59},[769],"visit\n │\n ├── 看 variant 当前是什么类型\n │\n ├── 把里面的数据取出来\n │\n └── 用这个数据调用 visitor\n",[20,3759,3757],{"__ignoreMap":59},[16,3761,3762],{},"其中 visitor 并不是某一种固定语法，而是任何能够被调用的对象。",[16,3764,3765],{},"在本例中：",[54,3767,3768],{"className":56,"code":2224,"language":58,"meta":59,"style":59},[20,3769,3770],{"__ignoreMap":59},[63,3771,3772],{"class":65,"line":66},[63,3773,2224],{"class":91},[16,3775,3776,3777,3779],{},"就是一个通过重载 ",[20,3778,2487],{}," 实现的函数对象。",[12,3781,764],{"id":764},[16,3783,3784],{},"见上方每个示例的\"运行结果\"。",[12,3786,3787],{"id":3787},"示例中的关键语法解释",[342,3789,3790,3809],{},[345,3791,3792],{},[348,3793,3794,3797,3800,3803,3806],{},[351,3795,3796],{"align":353},"示例",[351,3798,3799],{"align":353},"讲了什么",[351,3801,3802],{"align":353},"新出现的语法",[351,3804,3805],{"align":353},"为什么这样写",[351,3807,3808],{"align":353},"注意事项",[359,3810,3811,3836,3854,3873],{},[348,3812,3813,3816,3819,3827,3830],{},[364,3814,3815],{"align":353},"示例 1",[364,3817,3818],{"align":353},"基本赋值和 get",[364,3820,3821,3824,3825],{"align":353},[20,3822,3823],{},"std::variant\u003Cint, double, string>","、",[20,3826,388],{},[364,3828,3829],{"align":353},"variant 类型安全，赋值时自动切换类型",[364,3831,3832,3835],{"align":353},[20,3833,3834],{},"get\u003CT>"," 类型不对会抛异常",[348,3837,3838,3841,3844,3848,3851],{},[364,3839,3840],{"align":353},"示例 2",[364,3842,3843],{"align":353},"get_if 安全访问",[364,3845,3846],{"align":353},[20,3847,402],{},[364,3849,3850],{"align":353},"返回指针，类型不对返回 nullptr",[364,3852,3853],{"align":353},"比 get 更安全，推荐使用",[348,3855,3856,3859,3862,3867,3870],{},[364,3857,3858],{"align":353},"示例 3",[364,3860,3861],{"align":353},"visit 模式",[364,3863,3864],{"align":353},[20,3865,3866],{},"std::visit(lambda, v)",[364,3868,3869],{"align":353},"visit 强制覆盖所有类型，是 variant 的最佳访问方式",[364,3871,3872],{"align":353},"泛型 lambda + visit 是最简洁的组合",[348,3874,3875,3878,3881,3884,3887],{},[364,3876,3877],{"align":353},"示例 4",[364,3879,3880],{"align":353},"消息分发模式",[364,3882,3883],{"align":353},"struct visitor + variant",[364,3885,3886],{"align":353},"用 variant + visitor 实现类型安全的消息处理",[364,3888,3889],{"align":353},"visitor 必须为每种类型都提供 operator()",[12,3891,3893],{"id":3892},"variant-适合有限几种类型之一","variant 适合\"有限几种类型之一\"",[16,3895,3896,3898],{},[20,3897,824],{}," 不是为了替代所有继承和多态。它最适合这种情况：类型种类有限，而且你希望编译器提醒你把每种情况都处理掉。",[342,3900,3901,3911],{},[345,3902,3903],{},[348,3904,3905,3908],{},[351,3906,3907],{"align":353},"场景",[351,3909,3910],{"align":353},"推荐",[359,3912,3913,3922,3931,3940,3948],{},[348,3914,3915,3918],{},[364,3916,3917],{"align":353},"消息只有 Text \u002F Number \u002F Quit 三类",[364,3919,3920],{"align":353},[20,3921,5],{},[348,3923,3924,3927],{},[364,3925,3926],{"align":353},"状态只有 Idle \u002F Running \u002F Error 几类",[364,3928,3929],{"align":353},[20,3930,5],{},[348,3932,3933,3936],{},[364,3934,3935],{"align":353},"解析结果可能是 int \u002F double \u002F string",[364,3937,3938],{"align":353},[20,3939,5],{},[348,3941,3942,3945],{},[364,3943,3944],{"align":353},"类型种类很多且需要运行时扩展插件",[364,3946,3947],{"align":353},"继承 + 虚函数",[348,3949,3950,3953],{},[364,3951,3952],{"align":353},"所有对象共享一套接口",[364,3954,3955],{"align":353},"多态接口更自然",[440,3957,3959],{"id":3958},"示例-5用-variant-表示状态机","示例 5：用 variant 表示状态机",[54,3961,3963],{"className":56,"code":3962,"language":58,"meta":59,"style":59},"#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Ctype_traits>\n#include \u003Cvariant>\n\nstruct Idle {};\nstruct Running\n{\n    int task_id;\n};\nstruct Error\n{\n    std::string message;\n};\n\n\u002F\u002F variant 表示一个变量可以在多个候选类型中保存其中一种。\nusing State = std::variant\u003CIdle, Running, Error>;\n\nvoid print_state(const State& state)\n{\n    \u002F\u002F visit 会根据 variant 当前保存的类型调用对应处理逻辑。\n    std::visit([](const auto& s) {\n        using T = std::decay_t\u003Cdecltype(s)>;\n\n        if constexpr (std::is_same_v\u003CT, Idle>)\n        {\n            std::cout \u003C\u003C \"state: idle\\n\";\n        }\n        else if constexpr (std::is_same_v\u003CT, Running>)\n        {\n            std::cout \u003C\u003C \"state: running task \" \u003C\u003C s.task_id \u003C\u003C \"\\n\";\n        }\n        else if constexpr (std::is_same_v\u003CT, Error>)\n        {\n            std::cout \u003C\u003C \"state: error \" \u003C\u003C s.message \u003C\u003C \"\\n\";\n        }\n    }, state);\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    State state = Idle{};\n    print_state(state);\n\n    state = Running{42};\n    print_state(state);\n\n    state = Error{\"motor timeout\"};\n    print_state(state);\n\n    return 0;\n}\n",[20,3964,3965,3971,3977,3983,3989,3993,4002,4009,4013,4021,4025,4032,4036,4043,4047,4051,4056,4088,4092,4112,4116,4121,4140,4164,4168,4189,4193,4211,4215,4239,4243,4269,4273,4296,4300,4326,4330,4335,4339,4343,4351,4355,4360,4370,4379,4384,4399,4406,4411,4426,4433,4438,4447],{"__ignoreMap":59},[63,3966,3967,3969],{"class":65,"line":66},[63,3968,70],{"class":69},[63,3970,455],{"class":73},[63,3972,3973,3975],{"class":65,"line":117},[63,3974,70],{"class":69},[63,3976,468],{"class":73},[63,3978,3979,3981],{"class":65,"line":124},[63,3980,70],{"class":69},[63,3982,475],{"class":73},[63,3984,3985,3987],{"class":65,"line":144},[63,3986,70],{"class":69},[63,3988,74],{"class":73},[63,3990,3991],{"class":65,"line":159},[63,3992,121],{"emptyLinePlaceholder":120},[63,3994,3995,3997,4000],{"class":65,"line":187},[63,3996,1668],{"class":69},[63,3998,3999],{"class":87}," Idle",[63,4001,1703],{"class":91},[63,4003,4004,4006],{"class":65,"line":192},[63,4005,1668],{"class":69},[63,4007,4008],{"class":87}," Running\n",[63,4010,4011],{"class":65,"line":198},[63,4012,494],{"class":91},[63,4014,4015,4018],{"class":65,"line":224},[63,4016,4017],{"class":69},"    int",[63,4019,4020],{"class":91}," task_id;\n",[63,4022,4023],{"class":65,"line":229},[63,4024,1930],{"class":91},[63,4026,4027,4029],{"class":65,"line":235},[63,4028,1668],{"class":69},[63,4030,4031],{"class":87}," Error\n",[63,4033,4034],{"class":65,"line":272},[63,4035,494],{"class":91},[63,4037,4038,4040],{"class":65,"line":277},[63,4039,504],{"class":87},[63,4041,4042],{"class":91},"::string message;\n",[63,4044,4045],{"class":65,"line":283},[63,4046,1930],{"class":91},[63,4048,4049],{"class":65,"line":306},[63,4050,121],{"emptyLinePlaceholder":120},[63,4052,4053],{"class":65,"line":311},[63,4054,4055],{"class":140},"\u002F\u002F variant 表示一个变量可以在多个候选类型中保存其中一种。\n",[63,4057,4058,4060,4063,4065,4067,4069,4071,4073,4076,4078,4081,4083,4086],{"class":65,"line":317},[63,4059,1712],{"class":69},[63,4061,4062],{"class":87}," State",[63,4064,1718],{"class":69},[63,4066,166],{"class":87},[63,4068,169],{"class":91},[63,4070,824],{"class":87},[63,4072,216],{"class":91},[63,4074,4075],{"class":87},"Idle",[63,4077,98],{"class":91},[63,4079,4080],{"class":87},"Running",[63,4082,98],{"class":91},[63,4084,4085],{"class":87},"Error",[63,4087,1742],{"class":91},[63,4089,4090],{"class":65,"line":655},[63,4091,121],{"emptyLinePlaceholder":120},[63,4093,4094,4096,4099,4101,4103,4105,4107,4110],{"class":65,"line":695},[63,4095,809],{"class":69},[63,4097,4098],{"class":87}," print_state",[63,4100,175],{"class":91},[63,4102,817],{"class":69},[63,4104,4062],{"class":87},[63,4106,266],{"class":69},[63,4108,4109],{"class":299}," state",[63,4111,850],{"class":91},[63,4113,4114],{"class":65,"line":700},[63,4115,494],{"class":91},[63,4117,4118],{"class":65,"line":706},[63,4119,4120],{"class":140},"    \u002F\u002F visit 会根据 variant 当前保存的类型调用对应处理逻辑。\n",[63,4122,4123,4125,4127,4129,4131,4133,4135,4138],{"class":65,"line":740},[63,4124,504],{"class":87},[63,4126,169],{"class":91},[63,4128,290],{"class":87},[63,4130,293],{"class":91},[63,4132,817],{"class":69},[63,4134,1306],{"class":69},[63,4136,4137],{"class":299}," s",[63,4139,1311],{"class":91},[63,4141,4142,4145,4148,4150,4152,4154,4156,4158,4161],{"class":65,"line":745},[63,4143,4144],{"class":69},"        using",[63,4146,4147],{"class":87}," T",[63,4149,1718],{"class":69},[63,4151,166],{"class":87},[63,4153,169],{"class":91},[63,4155,1483],{"class":133},[63,4157,216],{"class":91},[63,4159,4160],{"class":69},"decltype",[63,4162,4163],{"class":91},"(s)>;\n",[63,4165,4166],{"class":65,"line":756},[63,4167,121],{"emptyLinePlaceholder":120},[63,4169,4170,4172,4174,4176,4178,4180,4182,4185,4187],{"class":65,"line":1107},[63,4171,1464],{"class":69},[63,4173,1467],{"class":69},[63,4175,241],{"class":91},[63,4177,88],{"class":87},[63,4179,1474],{"class":91},[63,4181,216],{"class":69},[63,4183,4184],{"class":91},"T, Idle",[63,4186,111],{"class":69},[63,4188,850],{"class":91},[63,4190,4191],{"class":65,"line":1112},[63,4192,1506],{"class":91},[63,4194,4195,4198,4200,4202,4205,4207,4209],{"class":65,"line":1123},[63,4196,4197],{"class":87},"            std",[63,4199,545],{"class":91},[63,4201,548],{"class":69},[63,4203,4204],{"class":73}," \"state: idle",[63,4206,575],{"class":133},[63,4208,578],{"class":73},[63,4210,538],{"class":91},[63,4212,4213],{"class":65,"line":1132},[63,4214,1524],{"class":91},[63,4216,4217,4220,4222,4224,4226,4228,4230,4232,4235,4237],{"class":65,"line":1137},[63,4218,4219],{"class":69},"        else",[63,4221,936],{"class":69},[63,4223,1467],{"class":69},[63,4225,241],{"class":91},[63,4227,88],{"class":87},[63,4229,1474],{"class":91},[63,4231,216],{"class":69},[63,4233,4234],{"class":91},"T, Running",[63,4236,111],{"class":69},[63,4238,850],{"class":91},[63,4240,4241],{"class":65,"line":1149},[63,4242,1506],{"class":91},[63,4244,4245,4247,4249,4251,4254,4256,4259,4261,4263,4265,4267],{"class":65,"line":1156},[63,4246,4197],{"class":87},[63,4248,545],{"class":91},[63,4250,548],{"class":69},[63,4252,4253],{"class":73}," \"state: running task \"",[63,4255,554],{"class":69},[63,4257,4258],{"class":91}," s.task_id ",[63,4260,548],{"class":69},[63,4262,572],{"class":73},[63,4264,575],{"class":133},[63,4266,578],{"class":73},[63,4268,538],{"class":91},[63,4270,4271],{"class":65,"line":1161},[63,4272,1524],{"class":91},[63,4274,4275,4277,4279,4281,4283,4285,4287,4289,4292,4294],{"class":65,"line":1181},[63,4276,4219],{"class":69},[63,4278,936],{"class":69},[63,4280,1467],{"class":69},[63,4282,241],{"class":91},[63,4284,88],{"class":87},[63,4286,1474],{"class":91},[63,4288,216],{"class":69},[63,4290,4291],{"class":91},"T, Error",[63,4293,111],{"class":69},[63,4295,850],{"class":91},[63,4297,4298],{"class":65,"line":1188},[63,4299,1506],{"class":91},[63,4301,4302,4304,4306,4308,4311,4313,4316,4318,4320,4322,4324],{"class":65,"line":1193},[63,4303,4197],{"class":87},[63,4305,545],{"class":91},[63,4307,548],{"class":69},[63,4309,4310],{"class":73}," \"state: error \"",[63,4312,554],{"class":69},[63,4314,4315],{"class":91}," s.message ",[63,4317,548],{"class":69},[63,4319,572],{"class":73},[63,4321,575],{"class":133},[63,4323,578],{"class":73},[63,4325,538],{"class":91},[63,4327,4328],{"class":65,"line":1202},[63,4329,1524],{"class":91},[63,4331,4332],{"class":65,"line":1601},[63,4333,4334],{"class":91},"    }, state);\n",[63,4336,4337],{"class":65,"line":1606},[63,4338,759],{"class":91},[63,4340,4341],{"class":65,"line":1615},[63,4342,121],{"emptyLinePlaceholder":120},[63,4344,4345,4347,4349],{"class":65,"line":2025},[63,4346,201],{"class":69},[63,4348,486],{"class":87},[63,4350,489],{"class":91},[63,4352,4353],{"class":65,"line":2036},[63,4354,494],{"class":91},[63,4356,4357],{"class":65,"line":2041},[63,4358,4359],{"class":140},"    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[63,4361,4362,4365,4367],{"class":65,"line":2050},[63,4363,4364],{"class":91},"    State state ",[63,4366,130],{"class":69},[63,4368,4369],{"class":91}," Idle{};\n",[63,4371,4373,4376],{"class":65,"line":4372},44,[63,4374,4375],{"class":87},"    print_state",[63,4377,4378],{"class":91},"(state);\n",[63,4380,4382],{"class":65,"line":4381},45,[63,4383,121],{"emptyLinePlaceholder":120},[63,4385,4387,4390,4392,4395,4397],{"class":65,"line":4386},46,[63,4388,4389],{"class":91},"    state ",[63,4391,130],{"class":69},[63,4393,4394],{"class":91}," Running{",[63,4396,1997],{"class":133},[63,4398,1930],{"class":91},[63,4400,4402,4404],{"class":65,"line":4401},47,[63,4403,4375],{"class":87},[63,4405,4378],{"class":91},[63,4407,4409],{"class":65,"line":4408},48,[63,4410,121],{"emptyLinePlaceholder":120},[63,4412,4414,4416,4418,4421,4424],{"class":65,"line":4413},49,[63,4415,4389],{"class":91},[63,4417,130],{"class":69},[63,4419,4420],{"class":91}," Error{",[63,4422,4423],{"class":73},"\"motor timeout\"",[63,4425,1930],{"class":91},[63,4427,4429,4431],{"class":65,"line":4428},50,[63,4430,4375],{"class":87},[63,4432,4378],{"class":91},[63,4434,4436],{"class":65,"line":4435},51,[63,4437,121],{"emptyLinePlaceholder":120},[63,4439,4441,4443,4445],{"class":65,"line":4440},52,[63,4442,748],{"class":69},[63,4444,751],{"class":133},[63,4446,538],{"class":91},[63,4448,4450],{"class":65,"line":4449},53,[63,4451,759],{"class":91},[16,4453,4454,765],{},[30,4455,764],{},[54,4457,4460],{"className":4458,"code":4459,"language":771},[769],"state: idle\nstate: running task 42\nstate: error motor timeout\n",[20,4461,4459],{"__ignoreMap":59},[16,4463,4464,4465,4468,4469,4471],{},"这里的状态永远只能是三种之一。相比用 ",[20,4466,4467],{},"int state_code"," 加一堆额外字段，",[20,4470,824],{}," 能把每种状态需要的数据放在对应类型里，减少“错误状态却还读 running 字段”这类问题。",[12,4473,4474],{"id":4474},"常见错误",[16,4476,4477],{},[30,4478,4479],{},"错误 1：get 用错类型抛异常",[54,4481,4483],{"className":56,"code":4482,"language":58,"meta":59,"style":59},"std::variant\u003Cint, double> v = 42;\nstd::cout \u003C\u003C std::get\u003Cdouble>(v);  \u002F\u002F ❌ 抛出 std::bad_variant_access！\n",[20,4484,4485,4507],{"__ignoreMap":59},[63,4486,4487,4489,4491,4493,4495,4498,4501,4503,4505],{"class":65,"line":66},[63,4488,88],{"class":87},[63,4490,92],{"class":91},[63,4492,95],{"class":69},[63,4494,98],{"class":91},[63,4496,4497],{"class":69},"double>",[63,4499,4500],{"class":91}," v ",[63,4502,130],{"class":69},[63,4504,134],{"class":133},[63,4506,538],{"class":91},[63,4508,4509,4511,4513,4515,4517,4519,4521,4523,4525,4528],{"class":65,"line":117},[63,4510,88],{"class":87},[63,4512,545],{"class":91},[63,4514,548],{"class":69},[63,4516,166],{"class":87},[63,4518,169],{"class":91},[63,4520,213],{"class":87},[63,4522,216],{"class":91},[63,4524,101],{"class":69},[63,4526,4527],{"class":91},">(v);",[63,4529,4530],{"class":140},"  \u002F\u002F ❌ 抛出 std::bad_variant_access！\n",[16,4532,4533,4534,4537,4538,33],{},"正确做法：先用 ",[20,4535,4536],{},"std::holds_alternative\u003Cdouble>(v)"," 检查，或用 ",[20,4539,4540],{},"std::get_if",[16,4542,4543],{},[30,4544,4545],{},"错误 2：variant 中没有默认类型时默认构造",[54,4547,4549],{"className":56,"code":4548,"language":58,"meta":59,"style":59},"std::variant\u003Cint, std::string> v;  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[20,4550,4551],{"__ignoreMap":59},[63,4552,4553,4555,4557,4559,4561,4563,4565,4567,4570],{"class":65,"line":66},[63,4554,88],{"class":87},[63,4556,92],{"class":91},[63,4558,95],{"class":69},[63,4560,98],{"class":91},[63,4562,88],{"class":87},[63,4564,108],{"class":91},[63,4566,111],{"class":69},[63,4568,4569],{"class":91}," v;",[63,4571,4572],{"class":140},"  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[16,4574,4575],{},"这种情况是合法的，但如果第一种类型没有默认构造函数，则编译失败。",[16,4577,4578],{},[30,4579,4580],{},"错误 3：visit 的 visitor 没有覆盖所有类型",[54,4582,4584],{"className":56,"code":4583,"language":58,"meta":59,"style":59},"struct Visitor {\n    void operator()(int) {}\n    \u002F\u002F 缺少 double 和 string 的 operator()\n};\nstd::variant\u003Cint, double, std::string> v;\nstd::visit(Visitor{}, v);  \u002F\u002F ❌ 编译错误！\n",[20,4585,4586,4595,4610,4615,4619,4641],{"__ignoreMap":59},[63,4587,4588,4590,4593],{"class":65,"line":66},[63,4589,1668],{"class":69},[63,4591,4592],{"class":87}," Visitor",[63,4594,1459],{"class":91},[63,4596,4597,4599,4601,4603,4605,4607],{"class":65,"line":117},[63,4598,1767],{"class":69},[63,4600,1770],{"class":69},[63,4602,1773],{"class":87},[63,4604,175],{"class":91},[63,4606,201],{"class":69},[63,4608,4609],{"class":91},") {}\n",[63,4611,4612],{"class":65,"line":124},[63,4613,4614],{"class":140},"    \u002F\u002F 缺少 double 和 string 的 operator()\n",[63,4616,4617],{"class":65,"line":144},[63,4618,1930],{"class":91},[63,4620,4621,4623,4625,4627,4629,4631,4633,4635,4637,4639],{"class":65,"line":159},[63,4622,88],{"class":87},[63,4624,92],{"class":91},[63,4626,95],{"class":69},[63,4628,98],{"class":91},[63,4630,101],{"class":69},[63,4632,98],{"class":91},[63,4634,88],{"class":87},[63,4636,108],{"class":91},[63,4638,111],{"class":69},[63,4640,114],{"class":91},[63,4642,4643,4645,4647,4649,4652],{"class":65,"line":187},[63,4644,88],{"class":87},[63,4646,169],{"class":91},[63,4648,290],{"class":87},[63,4650,4651],{"class":91},"(Visitor{}, v);",[63,4653,4654],{"class":140},"  \u002F\u002F ❌ 编译错误！\n",[16,4656,4657,4658,4660],{},"正确做法：visit 的 visitor 必须为 variant 中所有类型提供 ",[20,4659,2487],{},"，或者用泛型 lambda。",[12,4662,4663],{"id":4663},"使用建议",[4665,4666,4667,4675,4683,4691,4697,4703],"ol",{},[2120,4668,4669,4674],{},[30,4670,4671,4672],{},"替代 ",[20,4673,22],{},"：variant 类型安全，知道当前存的是什么。",[2120,4676,4677,33],{},[30,4678,4679,4680,4682],{},"用 ",[20,4681,2068],{}," + 泛型 lambda 是最简洁的访问方式",[2120,4684,4685,4690],{},[30,4686,4687,4688],{},"需要\"知道当前是哪种类型\"时用 ",[20,4689,4540],{},"：返回指针，安全高效。",[2120,4692,4693,4696],{},[30,4694,4695],{},"用 variant + visit 实现消息\u002F事件分发","：模式匹配的雏形。",[2120,4698,4699,4702],{},[30,4700,4701],{},"variant 的大小是所有类型中最大的 + 索引字段","：不要存太多大类型。",[2120,4704,4705,4708],{},[30,4706,4707],{},"类型种类有限时用 variant 更清晰","：如果类型需要随插件扩展，继承和虚函数通常更合适。",[12,4710,4711],{"id":4711},"小结",[2117,4713,4714,4719,4727,4732],{},[2120,4715,4716,4718],{},[20,4717,41],{}," 是类型安全的联合体。",[2120,4720,4721,4723,4724,4726],{},[20,4722,388],{}," 直接获取（不安全），",[20,4725,402],{}," 返回指针（安全）。",[2120,4728,4729,4731],{},[20,4730,422],{}," 是最推荐的方式，强制覆盖所有类型。",[2120,4733,4734],{},"适用于消息分发、可选配置、状态机等场景。",[4736,4737,4738],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":59,"searchDepth":117,"depth":117,"links":4740},[4741,4742,4743,4744,4745,4746,4747,4755,4756,4757,4760,4761,4762],{"id":14,"depth":117,"text":14},{"id":36,"depth":117,"text":36},{"id":45,"depth":117,"text":46},{"id":52,"depth":117,"text":52},{"id":77,"depth":117,"text":77},{"id":340,"depth":117,"text":340},{"id":438,"depth":117,"text":438,"children":4748},[4749,4750,4751,4752,4753],{"id":442,"depth":124,"text":443},{"id":776,"depth":124,"text":777},{"id":1217,"depth":124,"text":1218},{"id":1630,"depth":124,"text":1631},{"id":2065,"depth":124,"text":4754},"std::visit 与 Visitor 机制",{"id":764,"depth":117,"text":764},{"id":3787,"depth":117,"text":3787},{"id":3892,"depth":117,"text":3893,"children":4758},[4759],{"id":3958,"depth":124,"text":3959},{"id":4474,"depth":117,"text":4474},{"id":4663,"depth":117,"text":4663},{"id":4711,"depth":117,"text":4711},"2000-1500","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant",{"title":5,"description":59},"wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","zyi0TUGhG0XPcC-qvfi0VrKaeW98l258bFUgNninB74",[4776,4783,4789,4795,4801,4807,4813,4819,4825,4831,4837,4843,4849,4855,4861,4867,4873,4879,4885,4891,4897,4903,4909,4915,4921,4927,4933,4939,4945,4951,4957,4963,4969,4975,4981,4987,4993,4999,5005,5011,5016,5022,5027,5033,5039,5045,5051,5057,5063,5069,5075,5081,5087,5093,5095,5101,5107,5113,5119,5125,5131,5137,5143,5149,5155,5161,5167,5173,5179,5185,5191,5197,5203,5209,5215,5221,5227,5233,5239,5245,5251,5257,5263,5269,5275,5281,5287,5293,5299,5305,5311,5317],{"path":4777,"stem":4778,"title":4779,"authors":4780,"date":4764,"chapterOrder":4781,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试",[7],"0100",0,{"path":4784,"stem":4785,"title":4786,"authors":4787,"date":4764,"chapterOrder":4788,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识",[7],"0200",{"path":4790,"stem":4791,"title":4792,"authors":4793,"date":4764,"chapterOrder":4794,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放",[7],"0300",{"path":4796,"stem":4797,"title":4798,"authors":4799,"date":4764,"chapterOrder":4800,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出",[7],"0400",{"path":4802,"stem":4803,"title":4804,"authors":4805,"date":4764,"chapterOrder":4806,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符",[7],"0500",{"path":4808,"stem":4809,"title":4810,"authors":4811,"date":4764,"chapterOrder":4812,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构",[7],"0600",{"path":4814,"stem":4815,"title":4816,"authors":4817,"date":4764,"chapterOrder":4818,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组",[7],"0700",{"path":4820,"stem":4821,"title":4822,"authors":4823,"date":4764,"chapterOrder":4824,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件",[7],"0800",{"path":4826,"stem":4827,"title":4828,"authors":4829,"date":4764,"chapterOrder":4830,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针",[7],"0900",{"path":4832,"stem":4833,"title":4834,"authors":4835,"date":4764,"chapterOrder":4836,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",[7],"1000",{"path":4838,"stem":4839,"title":4840,"authors":4841,"date":4764,"chapterOrder":4842,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期",[7],"1100",{"path":4844,"stem":4845,"title":4846,"authors":4847,"date":4764,"chapterOrder":4848,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用",[7],"1200",{"path":4850,"stem":4851,"title":4852,"authors":4853,"date":4764,"chapterOrder":4854,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高",[7],"1300",{"path":4856,"stem":4857,"title":4858,"authors":4859,"date":4764,"chapterOrder":4860,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间",[7],"1350",{"path":4862,"stem":4863,"title":4864,"authors":4865,"date":4764,"chapterOrder":4866,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装",[7],"1400-0100",{"path":4868,"stem":4869,"title":4870,"authors":4871,"date":4764,"chapterOrder":4872,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理",[7],"1400-0200",{"path":4874,"stem":4875,"title":4876,"authors":4877,"date":4764,"chapterOrder":4878,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针",[7],"1400-0300",{"path":4880,"stem":4881,"title":4882,"authors":4883,"date":4764,"chapterOrder":4884,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载",[7],"1400-0400",{"path":4886,"stem":4887,"title":4888,"authors":4889,"date":4764,"chapterOrder":4890,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承",[7],"1400-0500",{"path":4892,"stem":4893,"title":4894,"authors":4895,"date":4764,"chapterOrder":4896,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态",[7],"1400-0600",{"path":4898,"stem":4899,"title":4900,"authors":4901,"date":4764,"chapterOrder":4902,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象",[7],"1400",{"path":4904,"stem":4905,"title":4906,"authors":4907,"date":4764,"chapterOrder":4908,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针",[7],"1450",{"path":4910,"stem":4911,"title":4912,"authors":4913,"date":4764,"chapterOrder":4914,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作",[7],"1500",{"path":4916,"stem":4917,"title":4918,"authors":4919,"date":4764,"chapterOrder":4920,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理",[7],"1600",{"path":4922,"stem":4923,"title":4924,"authors":4925,"date":4764,"chapterOrder":4926,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板",[7],"1700",{"path":4928,"stem":4929,"title":4930,"authors":4931,"date":4764,"chapterOrder":4932,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识",[7],"1800-0100",{"path":4934,"stem":4935,"title":4936,"authors":4937,"date":4764,"chapterOrder":4938,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array",[7],"1800-0200",{"path":4940,"stem":4941,"title":4942,"authors":4943,"date":4764,"chapterOrder":4944,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器",[7],"1800-0300",{"path":4946,"stem":4947,"title":4948,"authors":4949,"date":4764,"chapterOrder":4950,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器",[7],"1800-0400",{"path":4952,"stem":4953,"title":4954,"authors":4955,"date":4764,"chapterOrder":4956,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器",[7],"1800-0500",{"path":4958,"stem":4959,"title":4960,"authors":4961,"date":4764,"chapterOrder":4962,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器",[7],"1800-0600",{"path":4964,"stem":4965,"title":4966,"authors":4967,"date":4764,"chapterOrder":4968,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器",[7],"1800-0700",{"path":4970,"stem":4971,"title":4972,"authors":4973,"date":4764,"chapterOrder":4974,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器",[7],"1800-0800",{"path":4976,"stem":4977,"title":4978,"authors":4979,"date":4764,"chapterOrder":4980,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器",[7],"1800-0900",{"path":4982,"stem":4983,"title":4984,"authors":4985,"date":4764,"chapterOrder":4986,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器",[7],"1800-1000",{"path":4988,"stem":4989,"title":4990,"authors":4991,"date":4764,"chapterOrder":4992,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词",[7],"1800-1100",{"path":4994,"stem":4995,"title":4996,"authors":4997,"date":4764,"chapterOrder":4998,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法",[7],"1800-1200",{"path":5000,"stem":5001,"title":5002,"authors":5003,"date":4764,"chapterOrder":5004,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程",[7],"1800",{"path":5006,"stem":5007,"title":5008,"authors":5009,"date":4764,"chapterOrder":5010,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换",[7],"1900",{"path":5012,"stem":5013,"title":3219,"authors":5014,"date":4764,"chapterOrder":5015,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto",[7],"2000-0100",{"path":5017,"stem":5018,"title":5019,"authors":5020,"date":4764,"chapterOrder":5021,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr",[7],"2000-0200",{"path":5023,"stem":5024,"title":1712,"authors":5025,"date":4764,"chapterOrder":5026,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using",[7],"2000-0300",{"path":5028,"stem":5029,"title":5030,"authors":5031,"date":4764,"chapterOrder":5032,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class",[7],"2000-0400",{"path":5034,"stem":5035,"title":5036,"authors":5037,"date":4764,"chapterOrder":5038,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环",[7],"2000-0500",{"path":5040,"stem":5041,"title":5042,"authors":5043,"date":4764,"chapterOrder":5044,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定",[7],"2000-0600",{"path":5046,"stem":5047,"title":5048,"authors":5049,"date":4764,"chapterOrder":5050,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr",[7],"2000-0700",{"path":5052,"stem":5053,"title":5054,"authors":5055,"date":4764,"chapterOrder":5056,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII",[7],"2000-0800",{"path":5058,"stem":5059,"title":5060,"authors":5061,"date":4764,"chapterOrder":5062,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针",[7],"2000-0900",{"path":5064,"stem":5065,"title":5066,"authors":5067,"date":4764,"chapterOrder":5068,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义",[7],"2000-1000",{"path":5070,"stem":5071,"title":5072,"authors":5073,"date":4764,"chapterOrder":5074,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式",[7],"2000-1100",{"path":5076,"stem":5077,"title":5078,"authors":5079,"date":4764,"chapterOrder":5080,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function",[7],"2000-1200",{"path":5082,"stem":5083,"title":5084,"authors":5085,"date":4764,"chapterOrder":5086,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind",[7],"2000-1300",{"path":5088,"stem":5089,"title":5090,"authors":5091,"date":4764,"chapterOrder":5092,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional",[7],"2000-1400",{"path":4771,"stem":4773,"title":5,"authors":5094,"date":4764,"chapterOrder":4763,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},[7],{"path":5096,"stem":5097,"title":5098,"authors":5099,"date":4764,"chapterOrder":5100,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span",[7],"2000-1600",{"path":5102,"stem":5103,"title":5104,"authors":5105,"date":4764,"chapterOrder":5106,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print",[7],"2000-1700",{"path":5108,"stem":5109,"title":5110,"authors":5111,"date":4764,"chapterOrder":5112,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono",[7],"2000-1800",{"path":5114,"stem":5115,"title":5116,"authors":5117,"date":4764,"chapterOrder":5118,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-bing-fa-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-并发是什么","并发是什么",[7],"2000-1900-0100",{"path":5120,"stem":5121,"title":5122,"authors":5123,"date":4764,"chapterOrder":5124,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-bing-xing-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-并行是什么","并行是什么",[7],"2000-1900-0200",{"path":5126,"stem":5127,"title":5128,"authors":5129,"date":4764,"chapterOrder":5130,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-xie-cheng-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-协程是什么","协程是什么",[7],"2000-1900-0300",{"path":5132,"stem":5133,"title":5134,"authors":5135,"date":4764,"chapterOrder":5136,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1000-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1000-并发编程","并发编程",[7],"2000-1900-1000",{"path":5138,"stem":5139,"title":5140,"authors":5141,"date":4764,"chapterOrder":5142,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread","std::thread",[7],"2000-1900-1100",{"path":5144,"stem":5145,"title":5146,"authors":5147,"date":4764,"chapterOrder":5148,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1200-mutex-lock-guard","mutex 与 RAII 锁",[7],"2000-1900-1200",{"path":5150,"stem":5151,"title":5152,"authors":5153,"date":4764,"chapterOrder":5154,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1300-std-atomic","std::atomic",[7],"2000-1900-1300",{"path":5156,"stem":5157,"title":5158,"authors":5159,"date":4764,"chapterOrder":5160,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1400-condition-variable","condition_variable",[7],"2000-1900-1400",{"path":5162,"stem":5163,"title":5164,"authors":5165,"date":4764,"chapterOrder":5166,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1500-future-async-promise","future、async、promise 与 packaged_task",[7],"2000-1900-1500",{"path":5168,"stem":5169,"title":5170,"authors":5171,"date":4764,"chapterOrder":5172,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1600-jthread-stop-token","jthread 与 stop_token",[7],"2000-1900-1600",{"path":5174,"stem":5175,"title":5176,"authors":5177,"date":4764,"chapterOrder":5178,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1700-semaphore-latch-barrier","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1700-semaphore-latch-barrier","semaphore、latch 与 barrier",[7],"2000-1900-1700",{"path":5180,"stem":5181,"title":5182,"authors":5183,"date":4764,"chapterOrder":5184,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bing-xing-yu-xie-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发并行与协程","并发、并行与协程",[7],"2000-1900",{"path":5186,"stem":5187,"title":5188,"authors":5189,"date":4764,"chapterOrder":5190,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem",[7],"2000-2000",{"path":5192,"stem":5193,"title":5194,"authors":5195,"date":4764,"chapterOrder":5196,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介",[7],"2000-2100",{"path":5198,"stem":5199,"title":5200,"authors":5201,"date":4764,"chapterOrder":5202,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++",[7],"2000",{"path":5204,"stem":5205,"title":5206,"authors":5207,"date":4764,"chapterOrder":5208,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO",[7],"2100-0100-0100",{"path":5210,"stem":5211,"title":5212,"authors":5213,"date":4764,"chapterOrder":5214,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础",[7],"2100-0100-0200",{"path":5216,"stem":5217,"title":5218,"authors":5219,"date":4764,"chapterOrder":5220,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信教学",[7],"2100-0100-0300",{"path":5222,"stem":5223,"title":5224,"authors":5225,"date":4764,"chapterOrder":5226,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0350-chuan-kou-tong-xin-chuan-kou-bao-xie-yi-shi-li","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0350-串口通信串口包协议实例","串口通信串口包协议实例",[7],"2100-0100-0350",{"path":5228,"stem":5229,"title":5230,"authors":5231,"date":4764,"chapterOrder":5232,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信",[7],"2100-0100-0400",{"path":5234,"stem":5235,"title":5236,"authors":5237,"date":4764,"chapterOrder":5238,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信",[7],"2100-0100-0500",{"path":5240,"stem":5241,"title":5242,"authors":5243,"date":4764,"chapterOrder":5244,"chapterDepth":117,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成",[7],"2100-0100-0600",{"path":5246,"stem":5247,"title":5248,"authors":5249,"date":4764,"chapterOrder":5250,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库",[7],"2100-0100",{"path":5252,"stem":5253,"title":5254,"authors":5255,"date":4764,"chapterOrder":5256,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库",[7],"2100-0200",{"path":5258,"stem":5259,"title":5260,"authors":5261,"date":4764,"chapterOrder":5262,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库",[7],"2100-0300",{"path":5264,"stem":5265,"title":5266,"authors":5267,"date":4764,"chapterOrder":5268,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库",[7],"2100-0400",{"path":5270,"stem":5271,"title":5272,"authors":5273,"date":4764,"chapterOrder":5274,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库",[7],"2100-0500",{"path":5276,"stem":5277,"title":5278,"authors":5279,"date":4764,"chapterOrder":5280,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习",[7],"2100",{"path":5282,"stem":5283,"title":5284,"authors":5285,"date":4764,"chapterOrder":5286,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装",[7],"2200-0100",{"path":5288,"stem":5289,"title":5290,"authors":5291,"date":4764,"chapterOrder":5292,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项",[7],"2200-0200",{"path":5294,"stem":5295,"title":5296,"authors":5297,"date":4764,"chapterOrder":5298,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解",[7],"2200-0300",{"path":5300,"stem":5301,"title":5302,"authors":5303,"date":4764,"chapterOrder":5304,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法",[7],"2200-0400",{"path":5306,"stem":5307,"title":5308,"authors":5309,"date":4764,"chapterOrder":5310,"chapterDepth":66,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题",[7],"2200-0500",{"path":5312,"stem":5313,"title":5314,"authors":5315,"date":4764,"chapterOrder":5316,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":4769},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板",[7],"2200",{"path":4766,"stem":5318,"title":5319,"authors":5320,"date":4764,"chapterOrder":5321,"chapterDepth":4782,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":120,"isWikiIndex":120},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",[7],null,[5323,5325,5328,5331],{"name":7,"image":5324},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":5326,"image":5327},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":5329,"image":5330},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":5332,"image":5333},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431898663]