[{"data":1,"prerenderedAt":3444},["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":3058},{"id":4,"title":5,"body":6,"chapterDepth":64,"chapterOrder":3046,"date":3047,"description":57,"docKey":3048,"docRoot":3049,"docTitle":3050,"extension":3051,"isWikiDoc":118,"isWikiIndex":3052,"meta":3053,"navigation":118,"path":3054,"seo":3055,"stem":3056,"wikiDepth":64,"__hash__":3057},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant.md","std::variant",{"type":7,"value":8,"toc":3024},"minimark",[9,13,22,32,35,41,45,48,51,73,76,336,339,434,437,442,758,764,772,776,1203,1207,1213,1217,1616,1620,1626,1630,2051,2055,2061,2063,2066,2069,2171,2175,2180,2237,2241,2733,2737,2743,2753,2756,2761,2812,2822,2827,2854,2857,2862,2936,2943,2946,2993,2996,3020],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16,17,21],"p",{},"有时候一个变量需要存储\"可能是 int，也可能是 string，也可能是 double\"的值。传统的做法是 ",[18,19,20],"code",{},"union","（C 语言），但它不类型安全——你不知道当前存的是哪种类型，访问错了就崩溃。",[14,23,24,26,27,31],{},[18,25,5],{}," 是类型安全的联合体，能存储多种类型之一，并且",[28,29,30],"strong",{},"知道当前存的是哪种类型","。",[10,33,34],{"id":34},"这个特性是什么",[14,36,37,40],{},[18,38,39],{},"std::variant\u003CT1, T2, ...>"," 是 C++17 引入的类型安全的联合体。在同一时刻，它只存储其中一种类型的值。访问时编译器会帮你检查，不会出现\"访问了错误类型\"的问题。",[10,42,44],{"id":43},"c-标准版本","C++ 标准版本",[14,46,47],{},"C++17",[10,49,50],{"id":50},"需要的头文件",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cvariant>\n","cpp","",[18,59,60],{"__ignoreMap":57},[61,62,65,69],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"szBVR","#include",[61,70,72],{"class":71},"sZZnC"," \u003Cvariant>\n",[10,74,75],{"id":75},"基本语法",[52,77,79],{"className":54,"code":78,"language":56,"meta":57,"style":57},"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",[18,80,81,113,120,140,155,183,188,194,220,225,231,268,273,279,302,307,313],{"__ignoreMap":57},[61,82,83,87,91,94,97,100,102,104,107,110],{"class":63,"line":64},[61,84,86],{"class":85},"sScJk","std",[61,88,90],{"class":89},"sVt8B","::variant",[61,92,93],{"class":67},"\u003Cint",[61,95,96],{"class":89},", ",[61,98,99],{"class":67},"double",[61,101,96],{"class":89},[61,103,86],{"class":85},[61,105,106],{"class":89},"::string",[61,108,109],{"class":67},">",[61,111,112],{"class":89}," v;\n",[61,114,116],{"class":63,"line":115},2,[61,117,119],{"emptyLinePlaceholder":118},true,"\n",[61,121,123,126,129,133,136],{"class":63,"line":122},3,[61,124,125],{"class":89},"v ",[61,127,128],{"class":67},"=",[61,130,132],{"class":131},"sj4cs"," 42",[61,134,135],{"class":89},";",[61,137,139],{"class":138},"sJ8bj","                      \u002F\u002F 存 int\n",[61,141,143,145,147,150,152],{"class":63,"line":142},4,[61,144,125],{"class":89},[61,146,128],{"class":67},[61,148,149],{"class":131}," 3.14",[61,151,135],{"class":89},[61,153,154],{"class":138},"                    \u002F\u002F 存 double\n",[61,156,158,160,162,165,168,171,174,177,180],{"class":63,"line":157},5,[61,159,125],{"class":89},[61,161,128],{"class":67},[61,163,164],{"class":85}," std",[61,166,167],{"class":89},"::",[61,169,170],{"class":85},"string",[61,172,173],{"class":89},"(",[61,175,176],{"class":71},"\"hello\"",[61,178,179],{"class":89},");",[61,181,182],{"class":138},"   \u002F\u002F 存 string\n",[61,184,186],{"class":63,"line":185},6,[61,187,119],{"emptyLinePlaceholder":118},[61,189,191],{"class":63,"line":190},7,[61,192,193],{"class":138},"\u002F\u002F 访问方式 1：std::get\u003CT>(v) —— 类型不对抛异常\n",[61,195,197,200,203,205,207,209,212,215,217],{"class":63,"line":196},8,[61,198,199],{"class":67},"int",[61,201,202],{"class":89}," n ",[61,204,128],{"class":67},[61,206,164],{"class":85},[61,208,167],{"class":89},[61,210,211],{"class":85},"get",[61,213,214],{"class":89},"\u003C",[61,216,199],{"class":67},[61,218,219],{"class":89},">(v);\n",[61,221,223],{"class":63,"line":222},9,[61,224,119],{"emptyLinePlaceholder":118},[61,226,228],{"class":63,"line":227},10,[61,229,230],{"class":138},"\u002F\u002F 访问方式 2：std::get_if\u003CT>(&v) —— 类型不对返回 nullptr\n",[61,232,234,237,240,243,246,248,250,252,255,257,259,262,265],{"class":63,"line":233},11,[61,235,236],{"class":67},"if",[61,238,239],{"class":89}," (",[61,241,242],{"class":67},"auto*",[61,244,245],{"class":89}," p ",[61,247,128],{"class":67},[61,249,164],{"class":85},[61,251,167],{"class":89},[61,253,254],{"class":85},"get_if",[61,256,214],{"class":89},[61,258,199],{"class":67},[61,260,261],{"class":89},">(",[61,263,264],{"class":67},"&",[61,266,267],{"class":89},"v)) { ... }\n",[61,269,271],{"class":63,"line":270},12,[61,272,119],{"emptyLinePlaceholder":118},[61,274,276],{"class":63,"line":275},13,[61,277,278],{"class":138},"\u002F\u002F 访问方式 3：std::visit —— 用 visitor 模式处理所有可能的类型\n",[61,280,282,284,286,289,292,295,299],{"class":63,"line":281},14,[61,283,86],{"class":85},[61,285,167],{"class":89},[61,287,288],{"class":85},"visit",[61,290,291],{"class":89},"([](",[61,293,294],{"class":67},"auto&&",[61,296,298],{"class":297},"s4XuR"," val",[61,300,301],{"class":89},") { ... }, v);\n",[61,303,305],{"class":63,"line":304},15,[61,306,119],{"emptyLinePlaceholder":118},[61,308,310],{"class":63,"line":309},16,[61,311,312],{"class":138},"\u002F\u002F 查询当前存储的类型的索引\n",[61,314,316,319,322,324,327,330,333],{"class":63,"line":315},17,[61,317,318],{"class":67},"size_t",[61,320,321],{"class":89}," idx ",[61,323,128],{"class":67},[61,325,326],{"class":89}," v.",[61,328,329],{"class":85},"index",[61,331,332],{"class":89},"();",[61,334,335],{"class":138},"  \u002F\u002F 0-based\n",[10,337,338],{"id":338},"常用用法",[340,341,342,356],"table",{},[343,344,345],"thead",{},[346,347,348,353],"tr",{},[349,350,352],"th",{"align":351},"left","操作",[349,354,355],{"align":351},"说明",[357,358,359,370,380,394,404,414,424],"tbody",{},[346,360,361,367],{},[362,363,364],"td",{"align":351},[18,365,366],{},"v = value;",[362,368,369],{"align":351},"赋值（自动切换类型）",[346,371,372,377],{},[362,373,374],{"align":351},[18,375,376],{},"v.emplace\u003CT>(args...)",[362,378,379],{"align":351},"原地构造",[346,381,382,387],{},[362,383,384],{"align":351},[18,385,386],{},"std::get\u003CT>(v)",[362,388,389,390,393],{"align":351},"获取值（类型不对抛 ",[18,391,392],{},"std::bad_variant_access","）",[346,395,396,401],{},[362,397,398],{"align":351},[18,399,400],{},"std::get_if\u003CT>(&v)",[362,402,403],{"align":351},"安全获取（类型不对返回 nullptr）",[346,405,406,411],{},[362,407,408],{"align":351},[18,409,410],{},"v.index()",[362,412,413],{"align":351},"返回当前类型的索引（0-based）",[346,415,416,421],{},[362,417,418],{"align":351},[18,419,420],{},"std::visit(visitor, v)",[362,422,423],{"align":351},"用 visitor 模式处理",[346,425,426,431],{},[362,427,428],{"align":351},[18,429,430],{},"std::holds_alternative\u003CT>(v)",[362,432,433],{"align":351},"判断是否持有 T 类型",[10,435,436],{"id":436},"示例代码",[438,439,441],"h3",{"id":440},"示例-1variant-基本用法存不同类型的值","示例 1：variant 基本用法——存不同类型的值",[52,443,445],{"className":54,"code":444,"language":56,"meta":57,"style":57},"#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",[18,446,447,454,460,467,474,478,488,493,498,521,525,537,579,583,593,628,632,651,691,696,702,736,741,752],{"__ignoreMap":57},[61,448,449,451],{"class":63,"line":64},[61,450,68],{"class":67},[61,452,453],{"class":71}," \u003Ciostream>\n",[61,455,456,458],{"class":63,"line":115},[61,457,68],{"class":67},[61,459,72],{"class":71},[61,461,462,464],{"class":63,"line":122},[61,463,68],{"class":67},[61,465,466],{"class":71}," \u003Cstring>\n",[61,468,469,471],{"class":63,"line":142},[61,470,68],{"class":67},[61,472,473],{"class":71}," \u003Ctype_traits>\n",[61,475,476],{"class":63,"line":157},[61,477,119],{"emptyLinePlaceholder":118},[61,479,480,482,485],{"class":63,"line":185},[61,481,199],{"class":67},[61,483,484],{"class":85}," main",[61,486,487],{"class":89},"()\n",[61,489,490],{"class":63,"line":190},[61,491,492],{"class":89},"{\n",[61,494,495],{"class":63,"line":196},[61,496,497],{"class":138},"    \u002F\u002F v 可以存 int、double 或 string\n",[61,499,500,503,505,507,509,511,513,515,517,519],{"class":63,"line":222},[61,501,502],{"class":85},"    std",[61,504,90],{"class":89},[61,506,93],{"class":67},[61,508,96],{"class":89},[61,510,99],{"class":67},[61,512,96],{"class":89},[61,514,86],{"class":85},[61,516,106],{"class":89},[61,518,109],{"class":67},[61,520,112],{"class":89},[61,522,523],{"class":63,"line":227},[61,524,119],{"emptyLinePlaceholder":118},[61,526,527,530,532,534],{"class":63,"line":233},[61,528,529],{"class":89},"    v ",[61,531,128],{"class":67},[61,533,132],{"class":131},[61,535,536],{"class":89},";\n",[61,538,539,541,544,547,550,553,555,557,559,561,563,566,568,571,574,577],{"class":63,"line":270},[61,540,502],{"class":85},[61,542,543],{"class":89},"::cout ",[61,545,546],{"class":67},"\u003C\u003C",[61,548,549],{"class":71}," \"int: \"",[61,551,552],{"class":67}," \u003C\u003C",[61,554,164],{"class":85},[61,556,167],{"class":89},[61,558,211],{"class":85},[61,560,214],{"class":89},[61,562,199],{"class":67},[61,564,565],{"class":89},">(v) ",[61,567,546],{"class":67},[61,569,570],{"class":71}," \"",[61,572,573],{"class":131},"\\n",[61,575,576],{"class":71},"\"",[61,578,536],{"class":89},[61,580,581],{"class":63,"line":275},[61,582,119],{"emptyLinePlaceholder":118},[61,584,585,587,589,591],{"class":63,"line":281},[61,586,529],{"class":89},[61,588,128],{"class":67},[61,590,149],{"class":131},[61,592,536],{"class":89},[61,594,595,597,599,601,604,606,608,610,612,614,616,618,620,622,624,626],{"class":63,"line":304},[61,596,502],{"class":85},[61,598,543],{"class":89},[61,600,546],{"class":67},[61,602,603],{"class":71}," \"double: \"",[61,605,552],{"class":67},[61,607,164],{"class":85},[61,609,167],{"class":89},[61,611,211],{"class":85},[61,613,214],{"class":89},[61,615,99],{"class":67},[61,617,565],{"class":89},[61,619,546],{"class":67},[61,621,570],{"class":71},[61,623,573],{"class":131},[61,625,576],{"class":71},[61,627,536],{"class":89},[61,629,630],{"class":63,"line":309},[61,631,119],{"emptyLinePlaceholder":118},[61,633,634,636,638,640,642,644,646,648],{"class":63,"line":315},[61,635,529],{"class":89},[61,637,128],{"class":67},[61,639,164],{"class":85},[61,641,167],{"class":89},[61,643,170],{"class":85},[61,645,173],{"class":89},[61,647,176],{"class":71},[61,649,650],{"class":89},");\n",[61,652,654,656,658,660,663,665,667,669,671,673,675,677,679,681,683,685,687,689],{"class":63,"line":653},18,[61,655,502],{"class":85},[61,657,543],{"class":89},[61,659,546],{"class":67},[61,661,662],{"class":71}," \"string: \"",[61,664,552],{"class":67},[61,666,164],{"class":85},[61,668,167],{"class":89},[61,670,211],{"class":85},[61,672,214],{"class":89},[61,674,86],{"class":85},[61,676,167],{"class":89},[61,678,170],{"class":85},[61,680,565],{"class":89},[61,682,546],{"class":67},[61,684,570],{"class":71},[61,686,573],{"class":131},[61,688,576],{"class":71},[61,690,536],{"class":89},[61,692,694],{"class":63,"line":693},19,[61,695,119],{"emptyLinePlaceholder":118},[61,697,699],{"class":63,"line":698},20,[61,700,701],{"class":138},"    \u002F\u002F 查看当前类型索引\n",[61,703,705,707,709,711,714,716,718,720,723,725,727,729,731,733],{"class":63,"line":704},21,[61,706,502],{"class":85},[61,708,543],{"class":89},[61,710,546],{"class":67},[61,712,713],{"class":71}," \"current index: \"",[61,715,552],{"class":67},[61,717,326],{"class":89},[61,719,329],{"class":85},[61,721,722],{"class":89},"() ",[61,724,546],{"class":67},[61,726,570],{"class":71},[61,728,573],{"class":131},[61,730,576],{"class":71},[61,732,135],{"class":89},[61,734,735],{"class":138},"  \u002F\u002F 2 (string)\n",[61,737,739],{"class":63,"line":738},22,[61,740,119],{"emptyLinePlaceholder":118},[61,742,744,747,750],{"class":63,"line":743},23,[61,745,746],{"class":67},"    return",[61,748,749],{"class":131}," 0",[61,751,536],{"class":89},[61,753,755],{"class":63,"line":754},24,[61,756,757],{"class":89},"}\n",[14,759,760,763],{},[28,761,762],{},"运行结果","：",[52,765,770],{"className":766,"code":768,"language":769},[767],"language-text","int: 42\ndouble: 3.14\nstring: hello\ncurrent index: 2\n","text",[18,771,768],{"__ignoreMap":57},[438,773,775],{"id":774},"示例-2在示例-1-基础上用-get_if-安全访问","示例 2：在示例 1 基础上，用 get_if 安全访问",[52,777,779],{"className":54,"code":778,"language":56,"meta":57,"style":57},"#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",[18,780,781,787,793,799,803,849,853,858,888,893,922,927,959,963,989,993,1027,1031,1057,1061,1065,1069,1077,1081,1103,1108,1119,1128,1133,1145,1152,1157,1177,1184,1189,1198],{"__ignoreMap":57},[61,782,783,785],{"class":63,"line":64},[61,784,68],{"class":67},[61,786,453],{"class":71},[61,788,789,791],{"class":63,"line":115},[61,790,68],{"class":67},[61,792,72],{"class":71},[61,794,795,797],{"class":63,"line":122},[61,796,68],{"class":67},[61,798,466],{"class":71},[61,800,801],{"class":63,"line":142},[61,802,119],{"emptyLinePlaceholder":118},[61,804,805,808,811,813,816,818,820,823,825,827,829,831,833,835,837,839,841,843,846],{"class":63,"line":157},[61,806,807],{"class":67},"void",[61,809,810],{"class":85}," print_value",[61,812,173],{"class":89},[61,814,815],{"class":67},"const",[61,817,164],{"class":85},[61,819,167],{"class":89},[61,821,822],{"class":85},"variant",[61,824,214],{"class":89},[61,826,199],{"class":67},[61,828,96],{"class":89},[61,830,99],{"class":67},[61,832,96],{"class":89},[61,834,86],{"class":85},[61,836,167],{"class":89},[61,838,170],{"class":85},[61,840,109],{"class":89},[61,842,264],{"class":67},[61,844,845],{"class":297}," v",[61,847,848],{"class":89},")\n",[61,850,851],{"class":63,"line":185},[61,852,492],{"class":89},[61,854,855],{"class":63,"line":190},[61,856,857],{"class":138},"    \u002F\u002F 安全方式：逐个尝试，get_if 返回指针\n",[61,859,860,863,865,867,869,871,873,875,877,879,881,883,885],{"class":63,"line":196},[61,861,862],{"class":67},"    if",[61,864,239],{"class":89},[61,866,242],{"class":67},[61,868,245],{"class":89},[61,870,128],{"class":67},[61,872,164],{"class":85},[61,874,167],{"class":89},[61,876,254],{"class":85},[61,878,214],{"class":89},[61,880,199],{"class":67},[61,882,261],{"class":89},[61,884,264],{"class":67},[61,886,887],{"class":89},"v))\n",[61,889,890],{"class":63,"line":222},[61,891,892],{"class":89},"    {\n",[61,894,895,898,900,902,904,906,909,912,914,916,918,920],{"class":63,"line":227},[61,896,897],{"class":85},"        std",[61,899,543],{"class":89},[61,901,546],{"class":67},[61,903,549],{"class":71},[61,905,552],{"class":67},[61,907,908],{"class":67}," *",[61,910,911],{"class":89},"p ",[61,913,546],{"class":67},[61,915,570],{"class":71},[61,917,573],{"class":131},[61,919,576],{"class":71},[61,921,536],{"class":89},[61,923,924],{"class":63,"line":233},[61,925,926],{"class":89},"    }\n",[61,928,929,932,935,937,939,941,943,945,947,949,951,953,955,957],{"class":63,"line":270},[61,930,931],{"class":67},"    else",[61,933,934],{"class":67}," if",[61,936,239],{"class":89},[61,938,242],{"class":67},[61,940,245],{"class":89},[61,942,128],{"class":67},[61,944,164],{"class":85},[61,946,167],{"class":89},[61,948,254],{"class":85},[61,950,214],{"class":89},[61,952,99],{"class":67},[61,954,261],{"class":89},[61,956,264],{"class":67},[61,958,887],{"class":89},[61,960,961],{"class":63,"line":275},[61,962,892],{"class":89},[61,964,965,967,969,971,973,975,977,979,981,983,985,987],{"class":63,"line":281},[61,966,897],{"class":85},[61,968,543],{"class":89},[61,970,546],{"class":67},[61,972,603],{"class":71},[61,974,552],{"class":67},[61,976,908],{"class":67},[61,978,911],{"class":89},[61,980,546],{"class":67},[61,982,570],{"class":71},[61,984,573],{"class":131},[61,986,576],{"class":71},[61,988,536],{"class":89},[61,990,991],{"class":63,"line":304},[61,992,926],{"class":89},[61,994,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025],{"class":63,"line":309},[61,996,931],{"class":67},[61,998,934],{"class":67},[61,1000,239],{"class":89},[61,1002,242],{"class":67},[61,1004,245],{"class":89},[61,1006,128],{"class":67},[61,1008,164],{"class":85},[61,1010,167],{"class":89},[61,1012,254],{"class":85},[61,1014,214],{"class":89},[61,1016,86],{"class":85},[61,1018,167],{"class":89},[61,1020,170],{"class":85},[61,1022,261],{"class":89},[61,1024,264],{"class":67},[61,1026,887],{"class":89},[61,1028,1029],{"class":63,"line":315},[61,1030,892],{"class":89},[61,1032,1033,1035,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055],{"class":63,"line":653},[61,1034,897],{"class":85},[61,1036,543],{"class":89},[61,1038,546],{"class":67},[61,1040,662],{"class":71},[61,1042,552],{"class":67},[61,1044,908],{"class":67},[61,1046,911],{"class":89},[61,1048,546],{"class":67},[61,1050,570],{"class":71},[61,1052,573],{"class":131},[61,1054,576],{"class":71},[61,1056,536],{"class":89},[61,1058,1059],{"class":63,"line":693},[61,1060,926],{"class":89},[61,1062,1063],{"class":63,"line":698},[61,1064,757],{"class":89},[61,1066,1067],{"class":63,"line":704},[61,1068,119],{"emptyLinePlaceholder":118},[61,1070,1071,1073,1075],{"class":63,"line":738},[61,1072,199],{"class":67},[61,1074,484],{"class":85},[61,1076,487],{"class":89},[61,1078,1079],{"class":63,"line":743},[61,1080,492],{"class":89},[61,1082,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101],{"class":63,"line":754},[61,1084,502],{"class":85},[61,1086,90],{"class":89},[61,1088,93],{"class":67},[61,1090,96],{"class":89},[61,1092,99],{"class":67},[61,1094,96],{"class":89},[61,1096,86],{"class":85},[61,1098,106],{"class":89},[61,1100,109],{"class":67},[61,1102,112],{"class":89},[61,1104,1106],{"class":63,"line":1105},25,[61,1107,119],{"emptyLinePlaceholder":118},[61,1109,1111,1113,1115,1117],{"class":63,"line":1110},26,[61,1112,529],{"class":89},[61,1114,128],{"class":67},[61,1116,132],{"class":131},[61,1118,536],{"class":89},[61,1120,1122,1125],{"class":63,"line":1121},27,[61,1123,1124],{"class":85},"    print_value",[61,1126,1127],{"class":89},"(v);\n",[61,1129,1131],{"class":63,"line":1130},28,[61,1132,119],{"emptyLinePlaceholder":118},[61,1134,1136,1138,1140,1143],{"class":63,"line":1135},29,[61,1137,529],{"class":89},[61,1139,128],{"class":67},[61,1141,1142],{"class":131}," 3.14159",[61,1144,536],{"class":89},[61,1146,1148,1150],{"class":63,"line":1147},30,[61,1149,1124],{"class":85},[61,1151,1127],{"class":89},[61,1153,1155],{"class":63,"line":1154},31,[61,1156,119],{"emptyLinePlaceholder":118},[61,1158,1160,1162,1164,1166,1168,1170,1172,1175],{"class":63,"line":1159},32,[61,1161,529],{"class":89},[61,1163,128],{"class":67},[61,1165,164],{"class":85},[61,1167,167],{"class":89},[61,1169,170],{"class":85},[61,1171,173],{"class":89},[61,1173,1174],{"class":71},"\"C++17\"",[61,1176,650],{"class":89},[61,1178,1180,1182],{"class":63,"line":1179},33,[61,1181,1124],{"class":85},[61,1183,1127],{"class":89},[61,1185,1187],{"class":63,"line":1186},34,[61,1188,119],{"emptyLinePlaceholder":118},[61,1190,1192,1194,1196],{"class":63,"line":1191},35,[61,1193,746],{"class":67},[61,1195,749],{"class":131},[61,1197,536],{"class":89},[61,1199,1201],{"class":63,"line":1200},36,[61,1202,757],{"class":89},[14,1204,1205,763],{},[28,1206,762],{},[52,1208,1211],{"className":1209,"code":1210,"language":769},[767],"int: 42\ndouble: 3.14159\nstring: C++17\n",[18,1212,1210],{"__ignoreMap":57},[438,1214,1216],{"id":1215},"示例-3在示例-2-基础上用-stdvisit-处理所有类型","示例 3：在示例 2 基础上，用 std::visit 处理所有类型",[52,1218,1220],{"className":54,"code":1219,"language":56,"meta":57,"style":57},"#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",[18,1221,1222,1228,1234,1240,1244,1252,1256,1278,1282,1287,1310,1336,1341,1345,1355,1366,1370,1381,1391,1395,1414,1424,1428,1433,1458,1500,1505,1518,1523,1528,1532,1542,1546,1550,1554,1565,1597,1602,1611],{"__ignoreMap":57},[61,1223,1224,1226],{"class":63,"line":64},[61,1225,68],{"class":67},[61,1227,453],{"class":71},[61,1229,1230,1232],{"class":63,"line":115},[61,1231,68],{"class":67},[61,1233,72],{"class":71},[61,1235,1236,1238],{"class":63,"line":122},[61,1237,68],{"class":67},[61,1239,466],{"class":71},[61,1241,1242],{"class":63,"line":142},[61,1243,119],{"emptyLinePlaceholder":118},[61,1245,1246,1248,1250],{"class":63,"line":157},[61,1247,199],{"class":67},[61,1249,484],{"class":85},[61,1251,487],{"class":89},[61,1253,1254],{"class":63,"line":185},[61,1255,492],{"class":89},[61,1257,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276],{"class":63,"line":190},[61,1259,502],{"class":85},[61,1261,90],{"class":89},[61,1263,93],{"class":67},[61,1265,96],{"class":89},[61,1267,99],{"class":67},[61,1269,96],{"class":89},[61,1271,86],{"class":85},[61,1273,106],{"class":89},[61,1275,109],{"class":67},[61,1277,112],{"class":89},[61,1279,1280],{"class":63,"line":196},[61,1281,119],{"emptyLinePlaceholder":118},[61,1283,1284],{"class":63,"line":222},[61,1285,1286],{"class":138},"    \u002F\u002F std::visit 配合泛型 lambda 优雅处理所有类型\n",[61,1288,1289,1292,1295,1297,1300,1302,1305,1307],{"class":63,"line":227},[61,1290,1291],{"class":67},"    auto",[61,1293,1294],{"class":89}," printer ",[61,1296,128],{"class":67},[61,1298,1299],{"class":89}," [](",[61,1301,815],{"class":67},[61,1303,1304],{"class":67}," auto&",[61,1306,298],{"class":297},[61,1308,1309],{"class":89},") {\n",[61,1311,1312,1314,1316,1318,1321,1323,1326,1328,1330,1332,1334],{"class":63,"line":233},[61,1313,897],{"class":85},[61,1315,543],{"class":89},[61,1317,546],{"class":67},[61,1319,1320],{"class":71}," \"value: \"",[61,1322,552],{"class":67},[61,1324,1325],{"class":89}," val ",[61,1327,546],{"class":67},[61,1329,570],{"class":71},[61,1331,573],{"class":131},[61,1333,576],{"class":71},[61,1335,536],{"class":89},[61,1337,1338],{"class":63,"line":270},[61,1339,1340],{"class":89},"    };\n",[61,1342,1343],{"class":63,"line":275},[61,1344,119],{"emptyLinePlaceholder":118},[61,1346,1347,1349,1351,1353],{"class":63,"line":281},[61,1348,529],{"class":89},[61,1350,128],{"class":67},[61,1352,132],{"class":131},[61,1354,536],{"class":89},[61,1356,1357,1359,1361,1363],{"class":63,"line":304},[61,1358,502],{"class":85},[61,1360,167],{"class":89},[61,1362,288],{"class":85},[61,1364,1365],{"class":89},"(printer, v);\n",[61,1367,1368],{"class":63,"line":309},[61,1369,119],{"emptyLinePlaceholder":118},[61,1371,1372,1374,1376,1379],{"class":63,"line":315},[61,1373,529],{"class":89},[61,1375,128],{"class":67},[61,1377,1378],{"class":131}," 2.718",[61,1380,536],{"class":89},[61,1382,1383,1385,1387,1389],{"class":63,"line":653},[61,1384,502],{"class":85},[61,1386,167],{"class":89},[61,1388,288],{"class":85},[61,1390,1365],{"class":89},[61,1392,1393],{"class":63,"line":693},[61,1394,119],{"emptyLinePlaceholder":118},[61,1396,1397,1399,1401,1403,1405,1407,1409,1412],{"class":63,"line":698},[61,1398,529],{"class":89},[61,1400,128],{"class":67},[61,1402,164],{"class":85},[61,1404,167],{"class":89},[61,1406,170],{"class":85},[61,1408,173],{"class":89},[61,1410,1411],{"class":71},"\"hello variant\"",[61,1413,650],{"class":89},[61,1415,1416,1418,1420,1422],{"class":63,"line":704},[61,1417,502],{"class":85},[61,1419,167],{"class":89},[61,1421,288],{"class":85},[61,1423,1365],{"class":89},[61,1425,1426],{"class":63,"line":738},[61,1427,119],{"emptyLinePlaceholder":118},[61,1429,1430],{"class":63,"line":743},[61,1431,1432],{"class":138},"    \u002F\u002F 也可以返回不同类型的值\n",[61,1434,1435,1437,1440,1442,1444,1446,1448,1450,1453,1455],{"class":63,"line":754},[61,1436,1291],{"class":67},[61,1438,1439],{"class":89}," to_double ",[61,1441,128],{"class":67},[61,1443,1299],{"class":89},[61,1445,815],{"class":67},[61,1447,1304],{"class":67},[61,1449,298],{"class":297},[61,1451,1452],{"class":89},") -> ",[61,1454,99],{"class":67},[61,1456,1457],{"class":89}," {\n",[61,1459,1460,1463,1466,1468,1470,1473,1475,1477,1479,1482,1485,1488,1490,1492,1494,1496,1498],{"class":63,"line":1105},[61,1461,1462],{"class":67},"        if",[61,1464,1465],{"class":67}," constexpr",[61,1467,239],{"class":89},[61,1469,86],{"class":85},[61,1471,1472],{"class":89},"::is_same_v",[61,1474,214],{"class":67},[61,1476,86],{"class":85},[61,1478,167],{"class":89},[61,1480,1481],{"class":131},"decay_t",[61,1483,1484],{"class":67},"\u003Cdecltype",[61,1486,1487],{"class":89},"(val)",[61,1489,109],{"class":67},[61,1491,96],{"class":89},[61,1493,86],{"class":85},[61,1495,106],{"class":89},[61,1497,109],{"class":67},[61,1499,848],{"class":89},[61,1501,1502],{"class":63,"line":1110},[61,1503,1504],{"class":89},"        {\n",[61,1506,1507,1510,1513,1515],{"class":63,"line":1121},[61,1508,1509],{"class":67},"            return",[61,1511,1512],{"class":131}," 0.0",[61,1514,135],{"class":89},[61,1516,1517],{"class":138},"  \u002F\u002F string 不能转 double\n",[61,1519,1520],{"class":63,"line":1130},[61,1521,1522],{"class":89},"        }\n",[61,1524,1525],{"class":63,"line":1135},[61,1526,1527],{"class":67},"        else\n",[61,1529,1530],{"class":63,"line":1147},[61,1531,1504],{"class":89},[61,1533,1534,1536,1539],{"class":63,"line":1154},[61,1535,1509],{"class":67},[61,1537,1538],{"class":67}," static_cast\u003Cdouble>",[61,1540,1541],{"class":89},"(val);\n",[61,1543,1544],{"class":63,"line":1159},[61,1545,1522],{"class":89},[61,1547,1548],{"class":63,"line":1179},[61,1549,1340],{"class":89},[61,1551,1552],{"class":63,"line":1186},[61,1553,119],{"emptyLinePlaceholder":118},[61,1555,1556,1558,1560,1563],{"class":63,"line":1191},[61,1557,529],{"class":89},[61,1559,128],{"class":67},[61,1561,1562],{"class":131}," 10",[61,1564,536],{"class":89},[61,1566,1567,1569,1571,1573,1576,1578,1580,1582,1584,1587,1589,1591,1593,1595],{"class":63,"line":1200},[61,1568,502],{"class":85},[61,1570,543],{"class":89},[61,1572,546],{"class":67},[61,1574,1575],{"class":71}," \"to_double: \"",[61,1577,552],{"class":67},[61,1579,164],{"class":85},[61,1581,167],{"class":89},[61,1583,288],{"class":85},[61,1585,1586],{"class":89},"(to_double, v) ",[61,1588,546],{"class":67},[61,1590,570],{"class":71},[61,1592,573],{"class":131},[61,1594,576],{"class":71},[61,1596,536],{"class":89},[61,1598,1600],{"class":63,"line":1599},37,[61,1601,119],{"emptyLinePlaceholder":118},[61,1603,1605,1607,1609],{"class":63,"line":1604},38,[61,1606,746],{"class":67},[61,1608,749],{"class":131},[61,1610,536],{"class":89},[61,1612,1614],{"class":63,"line":1613},39,[61,1615,757],{"class":89},[14,1617,1618,763],{},[28,1619,762],{},[52,1621,1624],{"className":1622,"code":1623,"language":769},[767],"value: 42\nvalue: 2.718\nvalue: hello variant\nto_double: 10\n",[18,1625,1623],{"__ignoreMap":57},[438,1627,1629],{"id":1628},"示例-4在示例-3-基础上用-variant-表示消息类型","示例 4：在示例 3 基础上，用 variant 表示消息类型",[52,1631,1633],{"className":54,"code":1632,"language":56,"meta":57,"style":57},"#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",[18,1634,1635,1641,1647,1653,1657,1662,1678,1692,1702,1706,1741,1745,1750,1757,1761,1789,1793,1819,1823,1845,1849,1875,1879,1899,1903,1920,1924,1929,1933,1941,1945,1950,1954,1969,1980,1984,1998,2008,2012,2021,2032,2037,2046],{"__ignoreMap":57},[61,1636,1637,1639],{"class":63,"line":64},[61,1638,68],{"class":67},[61,1640,453],{"class":71},[61,1642,1643,1645],{"class":63,"line":115},[61,1644,68],{"class":67},[61,1646,72],{"class":71},[61,1648,1649,1651],{"class":63,"line":122},[61,1650,68],{"class":67},[61,1652,466],{"class":71},[61,1654,1655],{"class":63,"line":142},[61,1656,119],{"emptyLinePlaceholder":118},[61,1658,1659],{"class":63,"line":157},[61,1660,1661],{"class":138},"\u002F\u002F 定义消息类型\n",[61,1663,1664,1667,1670,1673,1675],{"class":63,"line":185},[61,1665,1666],{"class":67},"struct",[61,1668,1669],{"class":85}," TextMessage",[61,1671,1672],{"class":89}," { ",[61,1674,86],{"class":85},[61,1676,1677],{"class":89},"::string text; };\n",[61,1679,1680,1682,1685,1687,1689],{"class":63,"line":190},[61,1681,1666],{"class":67},[61,1683,1684],{"class":85}," NumberMessage",[61,1686,1672],{"class":89},[61,1688,199],{"class":67},[61,1690,1691],{"class":89}," number; };\n",[61,1693,1694,1696,1699],{"class":63,"line":196},[61,1695,1666],{"class":67},[61,1697,1698],{"class":85}," QuitMessage",[61,1700,1701],{"class":89}," {};\n",[61,1703,1704],{"class":63,"line":222},[61,1705,119],{"emptyLinePlaceholder":118},[61,1707,1708,1711,1714,1717,1719,1721,1723,1725,1728,1730,1733,1735,1738],{"class":63,"line":227},[61,1709,1710],{"class":67},"using",[61,1712,1713],{"class":85}," Message",[61,1715,1716],{"class":67}," =",[61,1718,164],{"class":85},[61,1720,167],{"class":89},[61,1722,822],{"class":85},[61,1724,214],{"class":89},[61,1726,1727],{"class":85},"TextMessage",[61,1729,96],{"class":89},[61,1731,1732],{"class":85},"NumberMessage",[61,1734,96],{"class":89},[61,1736,1737],{"class":85},"QuitMessage",[61,1739,1740],{"class":89},">;\n",[61,1742,1743],{"class":63,"line":233},[61,1744,119],{"emptyLinePlaceholder":118},[61,1746,1747],{"class":63,"line":270},[61,1748,1749],{"class":138},"\u002F\u002F 处理消息的 visitor\n",[61,1751,1752,1754],{"class":63,"line":275},[61,1753,1666],{"class":67},[61,1755,1756],{"class":85}," MessageHandler\n",[61,1758,1759],{"class":63,"line":281},[61,1760,492],{"class":89},[61,1762,1763,1766,1769,1772,1774,1776,1778,1780,1783,1786],{"class":63,"line":304},[61,1764,1765],{"class":67},"    void",[61,1767,1768],{"class":67}," operator",[61,1770,1771],{"class":85},"()",[61,1773,173],{"class":89},[61,1775,815],{"class":67},[61,1777,1669],{"class":85},[61,1779,264],{"class":67},[61,1781,1782],{"class":297}," msg",[61,1784,1785],{"class":89},") ",[61,1787,1788],{"class":67},"const\n",[61,1790,1791],{"class":63,"line":309},[61,1792,892],{"class":89},[61,1794,1795,1797,1799,1801,1804,1806,1809,1811,1813,1815,1817],{"class":63,"line":315},[61,1796,897],{"class":85},[61,1798,543],{"class":89},[61,1800,546],{"class":67},[61,1802,1803],{"class":71}," \"Text: \"",[61,1805,552],{"class":67},[61,1807,1808],{"class":89}," msg.text ",[61,1810,546],{"class":67},[61,1812,570],{"class":71},[61,1814,573],{"class":131},[61,1816,576],{"class":71},[61,1818,536],{"class":89},[61,1820,1821],{"class":63,"line":653},[61,1822,926],{"class":89},[61,1824,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843],{"class":63,"line":693},[61,1826,1765],{"class":67},[61,1828,1768],{"class":67},[61,1830,1771],{"class":85},[61,1832,173],{"class":89},[61,1834,815],{"class":67},[61,1836,1684],{"class":85},[61,1838,264],{"class":67},[61,1840,1782],{"class":297},[61,1842,1785],{"class":89},[61,1844,1788],{"class":67},[61,1846,1847],{"class":63,"line":698},[61,1848,892],{"class":89},[61,1850,1851,1853,1855,1857,1860,1862,1865,1867,1869,1871,1873],{"class":63,"line":704},[61,1852,897],{"class":85},[61,1854,543],{"class":89},[61,1856,546],{"class":67},[61,1858,1859],{"class":71}," \"Number: \"",[61,1861,552],{"class":67},[61,1863,1864],{"class":89}," msg.number ",[61,1866,546],{"class":67},[61,1868,570],{"class":71},[61,1870,573],{"class":131},[61,1872,576],{"class":71},[61,1874,536],{"class":89},[61,1876,1877],{"class":63,"line":738},[61,1878,926],{"class":89},[61,1880,1881,1883,1885,1887,1889,1891,1893,1895,1897],{"class":63,"line":743},[61,1882,1765],{"class":67},[61,1884,1768],{"class":67},[61,1886,1771],{"class":85},[61,1888,173],{"class":89},[61,1890,815],{"class":67},[61,1892,1698],{"class":85},[61,1894,264],{"class":67},[61,1896,1785],{"class":89},[61,1898,1788],{"class":67},[61,1900,1901],{"class":63,"line":754},[61,1902,892],{"class":89},[61,1904,1905,1907,1909,1911,1914,1916,1918],{"class":63,"line":1105},[61,1906,897],{"class":85},[61,1908,543],{"class":89},[61,1910,546],{"class":67},[61,1912,1913],{"class":71}," \"Quit!",[61,1915,573],{"class":131},[61,1917,576],{"class":71},[61,1919,536],{"class":89},[61,1921,1922],{"class":63,"line":1110},[61,1923,926],{"class":89},[61,1925,1926],{"class":63,"line":1121},[61,1927,1928],{"class":89},"};\n",[61,1930,1931],{"class":63,"line":1130},[61,1932,119],{"emptyLinePlaceholder":118},[61,1934,1935,1937,1939],{"class":63,"line":1135},[61,1936,199],{"class":67},[61,1938,484],{"class":85},[61,1940,487],{"class":89},[61,1942,1943],{"class":63,"line":1147},[61,1944,492],{"class":89},[61,1946,1947],{"class":63,"line":1154},[61,1948,1949],{"class":89},"    Message msg;\n",[61,1951,1952],{"class":63,"line":1159},[61,1953,119],{"emptyLinePlaceholder":118},[61,1955,1956,1959,1961,1964,1967],{"class":63,"line":1179},[61,1957,1958],{"class":89},"    msg ",[61,1960,128],{"class":67},[61,1962,1963],{"class":89}," TextMessage{",[61,1965,1966],{"class":71},"\"Hello World\"",[61,1968,1928],{"class":89},[61,1970,1971,1973,1975,1977],{"class":63,"line":1186},[61,1972,502],{"class":85},[61,1974,167],{"class":89},[61,1976,288],{"class":85},[61,1978,1979],{"class":89},"(MessageHandler{}, msg);\n",[61,1981,1982],{"class":63,"line":1191},[61,1983,119],{"emptyLinePlaceholder":118},[61,1985,1986,1988,1990,1993,1996],{"class":63,"line":1200},[61,1987,1958],{"class":89},[61,1989,128],{"class":67},[61,1991,1992],{"class":89}," NumberMessage{",[61,1994,1995],{"class":131},"42",[61,1997,1928],{"class":89},[61,1999,2000,2002,2004,2006],{"class":63,"line":1599},[61,2001,502],{"class":85},[61,2003,167],{"class":89},[61,2005,288],{"class":85},[61,2007,1979],{"class":89},[61,2009,2010],{"class":63,"line":1604},[61,2011,119],{"emptyLinePlaceholder":118},[61,2013,2014,2016,2018],{"class":63,"line":1613},[61,2015,1958],{"class":89},[61,2017,128],{"class":67},[61,2019,2020],{"class":89}," QuitMessage{};\n",[61,2022,2024,2026,2028,2030],{"class":63,"line":2023},40,[61,2025,502],{"class":85},[61,2027,167],{"class":89},[61,2029,288],{"class":85},[61,2031,1979],{"class":89},[61,2033,2035],{"class":63,"line":2034},41,[61,2036,119],{"emptyLinePlaceholder":118},[61,2038,2040,2042,2044],{"class":63,"line":2039},42,[61,2041,746],{"class":67},[61,2043,749],{"class":131},[61,2045,536],{"class":89},[61,2047,2049],{"class":63,"line":2048},43,[61,2050,757],{"class":89},[14,2052,2053,763],{},[28,2054,762],{},[52,2056,2059],{"className":2057,"code":2058,"language":769},[767],"Text: Hello World\nNumber: 42\nQuit!\n",[18,2060,2058],{"__ignoreMap":57},[10,2062,762],{"id":762},[14,2064,2065],{},"见上方每个示例的\"运行结果\"。",[10,2067,2068],{"id":2068},"示例中的关键语法解释",[340,2070,2071,2090],{},[343,2072,2073],{},[346,2074,2075,2078,2081,2084,2087],{},[349,2076,2077],{"align":351},"示例",[349,2079,2080],{"align":351},"讲了什么",[349,2082,2083],{"align":351},"新出现的语法",[349,2085,2086],{"align":351},"为什么这样写",[349,2088,2089],{"align":351},"注意事项",[357,2091,2092,2117,2135,2154],{},[346,2093,2094,2097,2100,2108,2111],{},[362,2095,2096],{"align":351},"示例 1",[362,2098,2099],{"align":351},"基本赋值和 get",[362,2101,2102,2105,2106],{"align":351},[18,2103,2104],{},"std::variant\u003Cint, double, string>","、",[18,2107,386],{},[362,2109,2110],{"align":351},"variant 类型安全，赋值时自动切换类型",[362,2112,2113,2116],{"align":351},[18,2114,2115],{},"get\u003CT>"," 类型不对会抛异常",[346,2118,2119,2122,2125,2129,2132],{},[362,2120,2121],{"align":351},"示例 2",[362,2123,2124],{"align":351},"get_if 安全访问",[362,2126,2127],{"align":351},[18,2128,400],{},[362,2130,2131],{"align":351},"返回指针，类型不对返回 nullptr",[362,2133,2134],{"align":351},"比 get 更安全，推荐使用",[346,2136,2137,2140,2143,2148,2151],{},[362,2138,2139],{"align":351},"示例 3",[362,2141,2142],{"align":351},"visit 模式",[362,2144,2145],{"align":351},[18,2146,2147],{},"std::visit(lambda, v)",[362,2149,2150],{"align":351},"visit 强制覆盖所有类型，是 variant 的最佳访问方式",[362,2152,2153],{"align":351},"泛型 lambda + visit 是最简洁的组合",[346,2155,2156,2159,2162,2165,2168],{},[362,2157,2158],{"align":351},"示例 4",[362,2160,2161],{"align":351},"消息分发模式",[362,2163,2164],{"align":351},"struct visitor + variant",[362,2166,2167],{"align":351},"用 variant + visitor 实现类型安全的消息处理",[362,2169,2170],{"align":351},"visitor 必须为每种类型都提供 operator()",[10,2172,2174],{"id":2173},"variant-适合有限几种类型之一","variant 适合\"有限几种类型之一\"",[14,2176,2177,2179],{},[18,2178,822],{}," 不是为了替代所有继承和多态。它最适合这种情况：类型种类有限，而且你希望编译器提醒你把每种情况都处理掉。",[340,2181,2182,2192],{},[343,2183,2184],{},[346,2185,2186,2189],{},[349,2187,2188],{"align":351},"场景",[349,2190,2191],{"align":351},"推荐",[357,2193,2194,2203,2212,2221,2229],{},[346,2195,2196,2199],{},[362,2197,2198],{"align":351},"消息只有 Text \u002F Number \u002F Quit 三类",[362,2200,2201],{"align":351},[18,2202,5],{},[346,2204,2205,2208],{},[362,2206,2207],{"align":351},"状态只有 Idle \u002F Running \u002F Error 几类",[362,2209,2210],{"align":351},[18,2211,5],{},[346,2213,2214,2217],{},[362,2215,2216],{"align":351},"解析结果可能是 int \u002F double \u002F string",[362,2218,2219],{"align":351},[18,2220,5],{},[346,2222,2223,2226],{},[362,2224,2225],{"align":351},"类型种类很多且需要运行时扩展插件",[362,2227,2228],{"align":351},"继承 + 虚函数",[346,2230,2231,2234],{},[362,2232,2233],{"align":351},"所有对象共享一套接口",[362,2235,2236],{"align":351},"多态接口更自然",[438,2238,2240],{"id":2239},"示例-5用-variant-表示状态机","示例 5：用 variant 表示状态机",[52,2242,2244],{"className":54,"code":2243,"language":56,"meta":57,"style":57},"#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",[18,2245,2246,2252,2258,2264,2270,2274,2283,2290,2294,2302,2306,2313,2317,2324,2328,2332,2337,2369,2373,2393,2397,2402,2421,2445,2449,2470,2474,2492,2496,2520,2524,2550,2554,2577,2581,2607,2611,2616,2620,2624,2632,2636,2641,2651,2660,2665,2680,2687,2692,2707,2714,2719,2728],{"__ignoreMap":57},[61,2247,2248,2250],{"class":63,"line":64},[61,2249,68],{"class":67},[61,2251,453],{"class":71},[61,2253,2254,2256],{"class":63,"line":115},[61,2255,68],{"class":67},[61,2257,466],{"class":71},[61,2259,2260,2262],{"class":63,"line":122},[61,2261,68],{"class":67},[61,2263,473],{"class":71},[61,2265,2266,2268],{"class":63,"line":142},[61,2267,68],{"class":67},[61,2269,72],{"class":71},[61,2271,2272],{"class":63,"line":157},[61,2273,119],{"emptyLinePlaceholder":118},[61,2275,2276,2278,2281],{"class":63,"line":185},[61,2277,1666],{"class":67},[61,2279,2280],{"class":85}," Idle",[61,2282,1701],{"class":89},[61,2284,2285,2287],{"class":63,"line":190},[61,2286,1666],{"class":67},[61,2288,2289],{"class":85}," Running\n",[61,2291,2292],{"class":63,"line":196},[61,2293,492],{"class":89},[61,2295,2296,2299],{"class":63,"line":222},[61,2297,2298],{"class":67},"    int",[61,2300,2301],{"class":89}," task_id;\n",[61,2303,2304],{"class":63,"line":227},[61,2305,1928],{"class":89},[61,2307,2308,2310],{"class":63,"line":233},[61,2309,1666],{"class":67},[61,2311,2312],{"class":85}," Error\n",[61,2314,2315],{"class":63,"line":270},[61,2316,492],{"class":89},[61,2318,2319,2321],{"class":63,"line":275},[61,2320,502],{"class":85},[61,2322,2323],{"class":89},"::string message;\n",[61,2325,2326],{"class":63,"line":281},[61,2327,1928],{"class":89},[61,2329,2330],{"class":63,"line":304},[61,2331,119],{"emptyLinePlaceholder":118},[61,2333,2334],{"class":63,"line":309},[61,2335,2336],{"class":138},"\u002F\u002F variant 表示一个变量可以在多个候选类型中保存其中一种。\n",[61,2338,2339,2341,2344,2346,2348,2350,2352,2354,2357,2359,2362,2364,2367],{"class":63,"line":315},[61,2340,1710],{"class":67},[61,2342,2343],{"class":85}," State",[61,2345,1716],{"class":67},[61,2347,164],{"class":85},[61,2349,167],{"class":89},[61,2351,822],{"class":85},[61,2353,214],{"class":89},[61,2355,2356],{"class":85},"Idle",[61,2358,96],{"class":89},[61,2360,2361],{"class":85},"Running",[61,2363,96],{"class":89},[61,2365,2366],{"class":85},"Error",[61,2368,1740],{"class":89},[61,2370,2371],{"class":63,"line":653},[61,2372,119],{"emptyLinePlaceholder":118},[61,2374,2375,2377,2380,2382,2384,2386,2388,2391],{"class":63,"line":693},[61,2376,807],{"class":67},[61,2378,2379],{"class":85}," print_state",[61,2381,173],{"class":89},[61,2383,815],{"class":67},[61,2385,2343],{"class":85},[61,2387,264],{"class":67},[61,2389,2390],{"class":297}," state",[61,2392,848],{"class":89},[61,2394,2395],{"class":63,"line":698},[61,2396,492],{"class":89},[61,2398,2399],{"class":63,"line":704},[61,2400,2401],{"class":138},"    \u002F\u002F visit 会根据 variant 当前保存的类型调用对应处理逻辑。\n",[61,2403,2404,2406,2408,2410,2412,2414,2416,2419],{"class":63,"line":738},[61,2405,502],{"class":85},[61,2407,167],{"class":89},[61,2409,288],{"class":85},[61,2411,291],{"class":89},[61,2413,815],{"class":67},[61,2415,1304],{"class":67},[61,2417,2418],{"class":297}," s",[61,2420,1309],{"class":89},[61,2422,2423,2426,2429,2431,2433,2435,2437,2439,2442],{"class":63,"line":743},[61,2424,2425],{"class":67},"        using",[61,2427,2428],{"class":85}," T",[61,2430,1716],{"class":67},[61,2432,164],{"class":85},[61,2434,167],{"class":89},[61,2436,1481],{"class":131},[61,2438,214],{"class":89},[61,2440,2441],{"class":67},"decltype",[61,2443,2444],{"class":89},"(s)>;\n",[61,2446,2447],{"class":63,"line":754},[61,2448,119],{"emptyLinePlaceholder":118},[61,2450,2451,2453,2455,2457,2459,2461,2463,2466,2468],{"class":63,"line":1105},[61,2452,1462],{"class":67},[61,2454,1465],{"class":67},[61,2456,239],{"class":89},[61,2458,86],{"class":85},[61,2460,1472],{"class":89},[61,2462,214],{"class":67},[61,2464,2465],{"class":89},"T, Idle",[61,2467,109],{"class":67},[61,2469,848],{"class":89},[61,2471,2472],{"class":63,"line":1110},[61,2473,1504],{"class":89},[61,2475,2476,2479,2481,2483,2486,2488,2490],{"class":63,"line":1121},[61,2477,2478],{"class":85},"            std",[61,2480,543],{"class":89},[61,2482,546],{"class":67},[61,2484,2485],{"class":71}," \"state: idle",[61,2487,573],{"class":131},[61,2489,576],{"class":71},[61,2491,536],{"class":89},[61,2493,2494],{"class":63,"line":1130},[61,2495,1522],{"class":89},[61,2497,2498,2501,2503,2505,2507,2509,2511,2513,2516,2518],{"class":63,"line":1135},[61,2499,2500],{"class":67},"        else",[61,2502,934],{"class":67},[61,2504,1465],{"class":67},[61,2506,239],{"class":89},[61,2508,86],{"class":85},[61,2510,1472],{"class":89},[61,2512,214],{"class":67},[61,2514,2515],{"class":89},"T, Running",[61,2517,109],{"class":67},[61,2519,848],{"class":89},[61,2521,2522],{"class":63,"line":1147},[61,2523,1504],{"class":89},[61,2525,2526,2528,2530,2532,2535,2537,2540,2542,2544,2546,2548],{"class":63,"line":1154},[61,2527,2478],{"class":85},[61,2529,543],{"class":89},[61,2531,546],{"class":67},[61,2533,2534],{"class":71}," \"state: running task \"",[61,2536,552],{"class":67},[61,2538,2539],{"class":89}," s.task_id ",[61,2541,546],{"class":67},[61,2543,570],{"class":71},[61,2545,573],{"class":131},[61,2547,576],{"class":71},[61,2549,536],{"class":89},[61,2551,2552],{"class":63,"line":1159},[61,2553,1522],{"class":89},[61,2555,2556,2558,2560,2562,2564,2566,2568,2570,2573,2575],{"class":63,"line":1179},[61,2557,2500],{"class":67},[61,2559,934],{"class":67},[61,2561,1465],{"class":67},[61,2563,239],{"class":89},[61,2565,86],{"class":85},[61,2567,1472],{"class":89},[61,2569,214],{"class":67},[61,2571,2572],{"class":89},"T, Error",[61,2574,109],{"class":67},[61,2576,848],{"class":89},[61,2578,2579],{"class":63,"line":1186},[61,2580,1504],{"class":89},[61,2582,2583,2585,2587,2589,2592,2594,2597,2599,2601,2603,2605],{"class":63,"line":1191},[61,2584,2478],{"class":85},[61,2586,543],{"class":89},[61,2588,546],{"class":67},[61,2590,2591],{"class":71}," \"state: error \"",[61,2593,552],{"class":67},[61,2595,2596],{"class":89}," s.message ",[61,2598,546],{"class":67},[61,2600,570],{"class":71},[61,2602,573],{"class":131},[61,2604,576],{"class":71},[61,2606,536],{"class":89},[61,2608,2609],{"class":63,"line":1200},[61,2610,1522],{"class":89},[61,2612,2613],{"class":63,"line":1599},[61,2614,2615],{"class":89},"    }, state);\n",[61,2617,2618],{"class":63,"line":1604},[61,2619,757],{"class":89},[61,2621,2622],{"class":63,"line":1613},[61,2623,119],{"emptyLinePlaceholder":118},[61,2625,2626,2628,2630],{"class":63,"line":2023},[61,2627,199],{"class":67},[61,2629,484],{"class":85},[61,2631,487],{"class":89},[61,2633,2634],{"class":63,"line":2034},[61,2635,492],{"class":89},[61,2637,2638],{"class":63,"line":2039},[61,2639,2640],{"class":138},"    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[61,2642,2643,2646,2648],{"class":63,"line":2048},[61,2644,2645],{"class":89},"    State state ",[61,2647,128],{"class":67},[61,2649,2650],{"class":89}," Idle{};\n",[61,2652,2654,2657],{"class":63,"line":2653},44,[61,2655,2656],{"class":85},"    print_state",[61,2658,2659],{"class":89},"(state);\n",[61,2661,2663],{"class":63,"line":2662},45,[61,2664,119],{"emptyLinePlaceholder":118},[61,2666,2668,2671,2673,2676,2678],{"class":63,"line":2667},46,[61,2669,2670],{"class":89},"    state ",[61,2672,128],{"class":67},[61,2674,2675],{"class":89}," Running{",[61,2677,1995],{"class":131},[61,2679,1928],{"class":89},[61,2681,2683,2685],{"class":63,"line":2682},47,[61,2684,2656],{"class":85},[61,2686,2659],{"class":89},[61,2688,2690],{"class":63,"line":2689},48,[61,2691,119],{"emptyLinePlaceholder":118},[61,2693,2695,2697,2699,2702,2705],{"class":63,"line":2694},49,[61,2696,2670],{"class":89},[61,2698,128],{"class":67},[61,2700,2701],{"class":89}," Error{",[61,2703,2704],{"class":71},"\"motor timeout\"",[61,2706,1928],{"class":89},[61,2708,2710,2712],{"class":63,"line":2709},50,[61,2711,2656],{"class":85},[61,2713,2659],{"class":89},[61,2715,2717],{"class":63,"line":2716},51,[61,2718,119],{"emptyLinePlaceholder":118},[61,2720,2722,2724,2726],{"class":63,"line":2721},52,[61,2723,746],{"class":67},[61,2725,749],{"class":131},[61,2727,536],{"class":89},[61,2729,2731],{"class":63,"line":2730},53,[61,2732,757],{"class":89},[14,2734,2735,763],{},[28,2736,762],{},[52,2738,2741],{"className":2739,"code":2740,"language":769},[767],"state: idle\nstate: running task 42\nstate: error motor timeout\n",[18,2742,2740],{"__ignoreMap":57},[14,2744,2745,2746,2749,2750,2752],{},"这里的状态永远只能是三种之一。相比用 ",[18,2747,2748],{},"int state_code"," 加一堆额外字段，",[18,2751,822],{}," 能把每种状态需要的数据放在对应类型里，减少“错误状态却还读 running 字段”这类问题。",[10,2754,2755],{"id":2755},"常见错误",[14,2757,2758],{},[28,2759,2760],{},"错误 1：get 用错类型抛异常",[52,2762,2764],{"className":54,"code":2763,"language":56,"meta":57,"style":57},"std::variant\u003Cint, double> v = 42;\nstd::cout \u003C\u003C std::get\u003Cdouble>(v);  \u002F\u002F ❌ 抛出 std::bad_variant_access！\n",[18,2765,2766,2788],{"__ignoreMap":57},[61,2767,2768,2770,2772,2774,2776,2779,2782,2784,2786],{"class":63,"line":64},[61,2769,86],{"class":85},[61,2771,90],{"class":89},[61,2773,93],{"class":67},[61,2775,96],{"class":89},[61,2777,2778],{"class":67},"double>",[61,2780,2781],{"class":89}," v ",[61,2783,128],{"class":67},[61,2785,132],{"class":131},[61,2787,536],{"class":89},[61,2789,2790,2792,2794,2796,2798,2800,2802,2804,2806,2809],{"class":63,"line":115},[61,2791,86],{"class":85},[61,2793,543],{"class":89},[61,2795,546],{"class":67},[61,2797,164],{"class":85},[61,2799,167],{"class":89},[61,2801,211],{"class":85},[61,2803,214],{"class":89},[61,2805,99],{"class":67},[61,2807,2808],{"class":89},">(v);",[61,2810,2811],{"class":138},"  \u002F\u002F ❌ 抛出 std::bad_variant_access！\n",[14,2813,2814,2815,2818,2819,31],{},"正确做法：先用 ",[18,2816,2817],{},"std::holds_alternative\u003Cdouble>(v)"," 检查，或用 ",[18,2820,2821],{},"std::get_if",[14,2823,2824],{},[28,2825,2826],{},"错误 2：variant 中没有默认类型时默认构造",[52,2828,2830],{"className":54,"code":2829,"language":56,"meta":57,"style":57},"std::variant\u003Cint, std::string> v;  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[18,2831,2832],{"__ignoreMap":57},[61,2833,2834,2836,2838,2840,2842,2844,2846,2848,2851],{"class":63,"line":64},[61,2835,86],{"class":85},[61,2837,90],{"class":89},[61,2839,93],{"class":67},[61,2841,96],{"class":89},[61,2843,86],{"class":85},[61,2845,106],{"class":89},[61,2847,109],{"class":67},[61,2849,2850],{"class":89}," v;",[61,2852,2853],{"class":138},"  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[14,2855,2856],{},"这种情况是合法的，但如果第一种类型没有默认构造函数，则编译失败。",[14,2858,2859],{},[28,2860,2861],{},"错误 3：visit 的 visitor 没有覆盖所有类型",[52,2863,2865],{"className":54,"code":2864,"language":56,"meta":57,"style":57},"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",[18,2866,2867,2876,2891,2896,2900,2922],{"__ignoreMap":57},[61,2868,2869,2871,2874],{"class":63,"line":64},[61,2870,1666],{"class":67},[61,2872,2873],{"class":85}," Visitor",[61,2875,1457],{"class":89},[61,2877,2878,2880,2882,2884,2886,2888],{"class":63,"line":115},[61,2879,1765],{"class":67},[61,2881,1768],{"class":67},[61,2883,1771],{"class":85},[61,2885,173],{"class":89},[61,2887,199],{"class":67},[61,2889,2890],{"class":89},") {}\n",[61,2892,2893],{"class":63,"line":122},[61,2894,2895],{"class":138},"    \u002F\u002F 缺少 double 和 string 的 operator()\n",[61,2897,2898],{"class":63,"line":142},[61,2899,1928],{"class":89},[61,2901,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920],{"class":63,"line":157},[61,2903,86],{"class":85},[61,2905,90],{"class":89},[61,2907,93],{"class":67},[61,2909,96],{"class":89},[61,2911,99],{"class":67},[61,2913,96],{"class":89},[61,2915,86],{"class":85},[61,2917,106],{"class":89},[61,2919,109],{"class":67},[61,2921,112],{"class":89},[61,2923,2924,2926,2928,2930,2933],{"class":63,"line":185},[61,2925,86],{"class":85},[61,2927,167],{"class":89},[61,2929,288],{"class":85},[61,2931,2932],{"class":89},"(Visitor{}, v);",[61,2934,2935],{"class":138},"  \u002F\u002F ❌ 编译错误！\n",[14,2937,2938,2939,2942],{},"正确做法：visit 的 visitor 必须为 variant 中所有类型提供 ",[18,2940,2941],{},"operator()","，或者用泛型 lambda。",[10,2944,2945],{"id":2945},"使用建议",[2947,2948,2949,2958,2967,2975,2981,2987],"ol",{},[2950,2951,2952,2957],"li",{},[28,2953,2954,2955],{},"替代 ",[18,2956,20],{},"：variant 类型安全，知道当前存的是什么。",[2950,2959,2960,31],{},[28,2961,2962,2963,2966],{},"用 ",[18,2964,2965],{},"std::visit"," + 泛型 lambda 是最简洁的访问方式",[2950,2968,2969,2974],{},[28,2970,2971,2972],{},"需要\"知道当前是哪种类型\"时用 ",[18,2973,2821],{},"：返回指针，安全高效。",[2950,2976,2977,2980],{},[28,2978,2979],{},"用 variant + visit 实现消息\u002F事件分发","：模式匹配的雏形。",[2950,2982,2983,2986],{},[28,2984,2985],{},"variant 的大小是所有类型中最大的 + 索引字段","：不要存太多大类型。",[2950,2988,2989,2992],{},[28,2990,2991],{},"类型种类有限时用 variant 更清晰","：如果类型需要随插件扩展，继承和虚函数通常更合适。",[10,2994,2995],{"id":2995},"小结",[2997,2998,2999,3004,3012,3017],"ul",{},[2950,3000,3001,3003],{},[18,3002,39],{}," 是类型安全的联合体。",[2950,3005,3006,3008,3009,3011],{},[18,3007,386],{}," 直接获取（不安全），",[18,3010,400],{}," 返回指针（安全）。",[2950,3013,3014,3016],{},[18,3015,420],{}," 是最推荐的方式，强制覆盖所有类型。",[2950,3018,3019],{},"适用于消息分发、可选配置、状态机等场景。",[3021,3022,3023],"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":57,"searchDepth":115,"depth":115,"links":3025},[3026,3027,3028,3029,3030,3031,3032,3038,3039,3040,3043,3044,3045],{"id":12,"depth":115,"text":12},{"id":34,"depth":115,"text":34},{"id":43,"depth":115,"text":44},{"id":50,"depth":115,"text":50},{"id":75,"depth":115,"text":75},{"id":338,"depth":115,"text":338},{"id":436,"depth":115,"text":436,"children":3033},[3034,3035,3036,3037],{"id":440,"depth":122,"text":441},{"id":774,"depth":122,"text":775},{"id":1215,"depth":122,"text":1216},{"id":1628,"depth":122,"text":1629},{"id":762,"depth":115,"text":762},{"id":2068,"depth":115,"text":2068},{"id":2173,"depth":115,"text":2174,"children":3041},[3042],{"id":2239,"depth":122,"text":2240},{"id":2755,"depth":115,"text":2755},{"id":2945,"depth":115,"text":2945},{"id":2995,"depth":115,"text":2995},"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":57},"wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","G2r4YiMeRAx4YONzS80WqUHF-yCqVyOqBEp8HA_6l4M",[3059,3065,3070,3075,3080,3085,3090,3095,3100,3105,3110,3115,3120,3125,3130,3135,3140,3145,3150,3155,3160,3165,3170,3175,3180,3185,3190,3195,3200,3205,3210,3215,3220,3225,3230,3235,3239,3244,3249,3254,3259,3264,3269,3274,3279,3284,3289,3294,3295,3300,3305,3310,3315,3320,3325,3330,3335,3340,3345,3350,3355,3360,3365,3370,3375,3380,3385,3390,3395,3400,3405,3410,3415,3420,3425,3430,3435,3440],{"path":3060,"stem":3061,"title":3062,"date":3047,"chapterOrder":3063,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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++开发环境搭建与测试","0100",0,{"path":3066,"stem":3067,"title":3068,"date":3047,"chapterOrder":3069,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":3071,"stem":3072,"title":3073,"date":3047,"chapterOrder":3074,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":3076,"stem":3077,"title":3078,"date":3047,"chapterOrder":3079,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":3081,"stem":3082,"title":3083,"date":3047,"chapterOrder":3084,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":3086,"stem":3087,"title":3088,"date":3047,"chapterOrder":3089,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":3091,"stem":3092,"title":3093,"date":3047,"chapterOrder":3094,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":3096,"stem":3097,"title":3098,"date":3047,"chapterOrder":3099,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":3101,"stem":3102,"title":3103,"date":3047,"chapterOrder":3104,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":3106,"stem":3107,"title":3108,"date":3047,"chapterOrder":3109,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":3111,"stem":3112,"title":3113,"date":3047,"chapterOrder":3114,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":3116,"stem":3117,"title":3118,"date":3047,"chapterOrder":3119,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":3121,"stem":3122,"title":3123,"date":3047,"chapterOrder":3124,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":3126,"stem":3127,"title":3128,"date":3047,"chapterOrder":3129,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":3131,"stem":3132,"title":3133,"date":3047,"chapterOrder":3134,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":3136,"stem":3137,"title":3138,"date":3047,"chapterOrder":3139,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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指针","1400-0300",{"path":3141,"stem":3142,"title":3143,"date":3047,"chapterOrder":3144,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":3146,"stem":3147,"title":3148,"date":3047,"chapterOrder":3149,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":3151,"stem":3152,"title":3153,"date":3047,"chapterOrder":3154,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":3156,"stem":3157,"title":3158,"date":3047,"chapterOrder":3159,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":3161,"stem":3162,"title":3163,"date":3047,"chapterOrder":3164,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":3166,"stem":3167,"title":3168,"date":3047,"chapterOrder":3169,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":3171,"stem":3172,"title":3173,"date":3047,"chapterOrder":3174,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":3176,"stem":3177,"title":3178,"date":3047,"chapterOrder":3179,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":3181,"stem":3182,"title":3183,"date":3047,"chapterOrder":3184,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":3186,"stem":3187,"title":3188,"date":3047,"chapterOrder":3189,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":3191,"stem":3192,"title":3193,"date":3047,"chapterOrder":3194,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-yu-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector与deque容器","vector与deque容器","1800-0400",{"path":3196,"stem":3197,"title":3198,"date":3047,"chapterOrder":3199,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-stack-queue-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-stack-queue-list容器","stack \u002F queue \u002F list 容器","1800-0500",{"path":3201,"stem":3202,"title":3203,"date":3047,"chapterOrder":3204,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-set-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-set-map容器","set \u002F map 容器","1800-0600",{"path":3206,"stem":3207,"title":3208,"date":3047,"chapterOrder":3209,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-函数对象与谓词","函数对象与谓词","1800-0700",{"path":3211,"stem":3212,"title":3213,"date":3047,"chapterOrder":3214,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-常用算法","常用算法","1800-0800",{"path":3216,"stem":3217,"title":3218,"date":3047,"chapterOrder":3219,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":3221,"stem":3222,"title":3223,"date":3047,"chapterOrder":3224,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":3226,"stem":3227,"title":3228,"date":3047,"chapterOrder":3229,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":3231,"stem":3232,"title":3233,"date":3047,"chapterOrder":3234,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":3236,"stem":3237,"title":1710,"date":3047,"chapterOrder":3238,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":3240,"stem":3241,"title":3242,"date":3047,"chapterOrder":3243,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":3245,"stem":3246,"title":3247,"date":3047,"chapterOrder":3248,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":3250,"stem":3251,"title":3252,"date":3047,"chapterOrder":3253,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":3255,"stem":3256,"title":3257,"date":3047,"chapterOrder":3258,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":3260,"stem":3261,"title":3262,"date":3047,"chapterOrder":3263,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":3265,"stem":3266,"title":3267,"date":3047,"chapterOrder":3268,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":3270,"stem":3271,"title":3272,"date":3047,"chapterOrder":3273,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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-右值引用和移动语义","右值引用和移动语义","2000-1000",{"path":3275,"stem":3276,"title":3277,"date":3047,"chapterOrder":3278,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":3280,"stem":3281,"title":3282,"date":3047,"chapterOrder":3283,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":3285,"stem":3286,"title":3287,"date":3047,"chapterOrder":3288,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":3290,"stem":3291,"title":3292,"date":3047,"chapterOrder":3293,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":3054,"stem":3056,"title":5,"date":3047,"chapterOrder":3046,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},{"path":3296,"stem":3297,"title":3298,"date":3047,"chapterOrder":3299,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":3301,"stem":3302,"title":3303,"date":3047,"chapterOrder":3304,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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","2000-1700",{"path":3306,"stem":3307,"title":3308,"date":3047,"chapterOrder":3309,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":3311,"stem":3312,"title":3313,"date":3047,"chapterOrder":3314,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 与 join","2000-1900-0100",{"path":3316,"stem":3317,"title":3318,"date":3047,"chapterOrder":3319,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":3321,"stem":3322,"title":3323,"date":3047,"chapterOrder":3324,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":3326,"stem":3327,"title":3328,"date":3047,"chapterOrder":3329,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":3331,"stem":3332,"title":3333,"date":3047,"chapterOrder":3334,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":3336,"stem":3337,"title":3338,"date":3047,"chapterOrder":3339,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":3341,"stem":3342,"title":3343,"date":3047,"chapterOrder":3344,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":3346,"stem":3347,"title":3348,"date":3047,"chapterOrder":3349,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":3351,"stem":3352,"title":3353,"date":3047,"chapterOrder":3354,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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","2100-0100-0100",{"path":3356,"stem":3357,"title":3358,"date":3047,"chapterOrder":3359,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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 基础","2100-0100-0200",{"path":3361,"stem":3362,"title":3363,"date":3047,"chapterOrder":3364,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":3366,"stem":3367,"title":3368,"date":3047,"chapterOrder":3369,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":3371,"stem":3372,"title":3373,"date":3047,"chapterOrder":3374,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":3376,"stem":3377,"title":3378,"date":3047,"chapterOrder":3379,"chapterDepth":115,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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 集成","2100-0100-0600",{"path":3381,"stem":3382,"title":3383,"date":3047,"chapterOrder":3384,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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库","2100-0100",{"path":3386,"stem":3387,"title":3388,"date":3047,"chapterOrder":3389,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":3391,"stem":3392,"title":3393,"date":3047,"chapterOrder":3394,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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计算机视觉库","2100-0300",{"path":3396,"stem":3397,"title":3398,"date":3047,"chapterOrder":3399,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":3401,"stem":3402,"title":3403,"date":3047,"chapterOrder":3404,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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 李群李代数库","2100-0500",{"path":3406,"stem":3407,"title":3408,"date":3047,"chapterOrder":3409,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":3411,"stem":3412,"title":3413,"date":3047,"chapterOrder":3414,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":3416,"stem":3417,"title":3418,"date":3047,"chapterOrder":3419,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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与公共编译选项","2200-0200",{"path":3421,"stem":3422,"title":3423,"date":3047,"chapterOrder":3424,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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详解","2200-0300",{"path":3426,"stem":3427,"title":3428,"date":3047,"chapterOrder":3429,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":3431,"stem":3432,"title":3433,"date":3047,"chapterOrder":3434,"chapterDepth":64,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\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-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":3436,"stem":3437,"title":3438,"date":3047,"chapterOrder":3439,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":3052},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":3049,"stem":3441,"title":3442,"date":3047,"chapterOrder":3443,"chapterDepth":3064,"docKey":3048,"docRoot":3049,"docTitle":3050,"isWikiDoc":118,"isWikiIndex":118},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",null,1784505234692]