[{"data":1,"prerenderedAt":5209},["ShallowReactive",2],{"wiki-page-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant":3,"wiki-doc-items-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant":4779,"language-switcher-data-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant":5193,"wiki-i18n-paths-\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant":5208},{"id":4,"title":5,"body":6,"canonicalPath":4761,"chapterDepth":64,"chapterOrder":4762,"date":4763,"description":57,"docI18nKey":4764,"docKey":4765,"docRoot":4766,"docTitle":4767,"extension":4768,"i18nKey":4769,"isBlogPost":4770,"isWikiDoc":118,"isWikiIndex":4770,"layout":4771,"legacyPath":4771,"locale":4772,"localeSlug":4773,"meta":4774,"navigation":118,"path":4761,"seo":4775,"sourcePath":4776,"sourceStem":4769,"stem":4777,"wikiDepth":64,"__hash__":4778},"content\u002F_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant.md","std::variant",{"type":7,"value":8,"toc":4737},"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,2068,2071,2086,2089,2095,2111,2114,2137,2140,2177,2184,2193,2206,2209,2217,2220,2229,2232,2238,2240,2249,2252,2260,2263,2266,2280,2283,2303,2305,2309,2315,2324,2326,2399,2402,2410,2413,2432,2435,2438,2458,2461,2469,2472,2477,2479,2487,2490,2519,2525,2544,2549,2608,2611,2619,2621,2680,2682,2690,2692,2741,2743,2751,2754,2762,2768,2770,2776,2778,2809,2814,2822,2828,2842,2845,2872,2875,2881,2883,2886,2917,2920,2934,2937,2964,2967,2973,2975,2978,3005,3008,3033,3035,3041,3044,3050,3055,3064,3066,3072,3075,3080,3084,3087,3096,3099,3102,3108,3111,3119,3122,3128,3130,3134,3136,3200,3203,3206,3208,3277,3280,3295,3298,3310,3313,3379,3382,3391,3393,3408,3411,3413,3417,3420,3452,3455,3471,3477,3607,3610,3612,3615,3618,3632,3635,3638,3646,3649,3655,3658,3666,3669,3672,3688,3691,3697,3699,3713,3716,3730,3733,3749,3752,3758,3761,3764,3772,3778,3780,3783,3786,3888,3892,3897,3954,3958,4450,4454,4460,4470,4473,4478,4529,4539,4544,4571,4574,4579,4653,4659,4662,4707,4710,4733],[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},[438,2062,2064,2067],{"id":2063},"stdvisit-與-visitor-機制",[18,2065,2066],{},"std::visit"," 與 Visitor 機制",[14,2069,2070],{},"上面的代碼中：",[52,2072,2074],{"className":54,"code":2073,"language":56,"meta":57,"style":57},"std::visit(MessageHandler{}, msg);\n",[18,2075,2076],{"__ignoreMap":57},[61,2077,2078,2080,2082,2084],{"class":63,"line":64},[61,2079,86],{"class":85},[61,2081,167],{"class":89},[61,2083,288],{"class":85},[61,2085,1979],{"class":89},[14,2087,2088],{},"這一句剛開始看起來可能比較奇怪。",[14,2090,2091,2092,2094],{},"先記住 ",[18,2093,2066],{}," 最基本的形式：",[52,2096,2098],{"className":54,"code":2097,"language":56,"meta":57,"style":57},"std::visit(visitor, variant对象);\n",[18,2099,2100],{"__ignoreMap":57},[61,2101,2102,2104,2106,2108],{"class":63,"line":64},[61,2103,86],{"class":85},[61,2105,167],{"class":89},[61,2107,288],{"class":85},[61,2109,2110],{"class":89},"(visitor, variant对象);\n",[14,2112,2113],{},"其中：",[2115,2116,2117,2123,2129],"ul",{},[2118,2119,2120,2121],"li",{},"第二個參數是 ",[18,2122,5],{},[2118,2124,2125,2126],{},"第一個參數是一個",[28,2127,2128],{},"可調用對象（Callable）",[2118,2130,2131,2133,2134,2136],{},[18,2132,2066],{}," 會根據 ",[18,2135,822],{}," 當前保存的數據類型，調用對應的處理函數",[14,2138,2139],{},"例如：",[52,2141,2143],{"className":54,"code":2142,"language":56,"meta":57,"style":57},"Message msg;\n\nmsg = TextMessage{\"Hello World\"};\nstd::visit(MessageHandler{}, msg);\n",[18,2144,2145,2150,2154,2167],{"__ignoreMap":57},[61,2146,2147],{"class":63,"line":64},[61,2148,2149],{"class":89},"Message msg;\n",[61,2151,2152],{"class":63,"line":115},[61,2153,119],{"emptyLinePlaceholder":118},[61,2155,2156,2159,2161,2163,2165],{"class":63,"line":122},[61,2157,2158],{"class":89},"msg ",[61,2160,128],{"class":67},[61,2162,1963],{"class":89},[61,2164,1966],{"class":71},[61,2166,1928],{"class":89},[61,2168,2169,2171,2173,2175],{"class":63,"line":142},[61,2170,86],{"class":85},[61,2172,167],{"class":89},[61,2174,288],{"class":85},[61,2176,1979],{"class":89},[14,2178,2179,2180,2183],{},"此時 ",[18,2181,2182],{},"msg"," 內部保存的是：",[52,2185,2187],{"className":54,"code":2186,"language":56,"meta":57,"style":57},"TextMessage\n",[18,2188,2189],{"__ignoreMap":57},[61,2190,2191],{"class":63,"line":64},[61,2192,2186],{"class":89},[14,2194,2195,2196,2198,2199,2201,2202,2205],{},"因此 ",[18,2197,2066],{}," 會把這個 ",[18,2200,1727],{}," 取出來，並交給 ",[18,2203,2204],{},"MessageHandler"," 處理。",[2207,2208],"hr",{},[2210,2211,2213,2216],"h4",{"id":2212},"messagehandler-是什麼",[18,2214,2215],{},"MessageHandler{}"," 是什麼？",[14,2218,2219],{},"這裡：",[52,2221,2223],{"className":54,"code":2222,"language":56,"meta":57,"style":57},"MessageHandler{}\n",[18,2224,2225],{"__ignoreMap":57},[61,2226,2227],{"class":63,"line":64},[61,2228,2222],{"class":89},[14,2230,2231],{},"不是函數，也不是特殊語法。",[14,2233,2234,2235,2237],{},"它就是創建了一個臨時的 ",[18,2236,2204],{}," 對象。",[14,2239,2139],{},[52,2241,2243],{"className":54,"code":2242,"language":56,"meta":57,"style":57},"MessageHandler handler;\n",[18,2244,2245],{"__ignoreMap":57},[61,2246,2247],{"class":63,"line":64},[61,2248,2242],{"class":89},[14,2250,2251],{},"和：",[52,2253,2254],{"className":54,"code":2222,"language":56,"meta":57,"style":57},[18,2255,2256],{"__ignoreMap":57},[61,2257,2258],{"class":63,"line":64},[61,2259,2222],{"class":89},[14,2261,2262],{},"創建的對象類型是一樣的，只不過後者是臨時對象。",[14,2264,2265],{},"因此：",[52,2267,2268],{"className":54,"code":2073,"language":56,"meta":57,"style":57},[18,2269,2270],{"__ignoreMap":57},[61,2271,2272,2274,2276,2278],{"class":63,"line":64},[61,2273,86],{"class":85},[61,2275,167],{"class":89},[61,2277,288],{"class":85},[61,2279,1979],{"class":89},[14,2281,2282],{},"也可以寫成：",[52,2284,2286],{"className":54,"code":2285,"language":56,"meta":57,"style":57},"MessageHandler handler;\nstd::visit(handler, msg);\n",[18,2287,2288,2292],{"__ignoreMap":57},[61,2289,2290],{"class":63,"line":64},[61,2291,2242],{"class":89},[61,2293,2294,2296,2298,2300],{"class":63,"line":115},[61,2295,86],{"class":85},[61,2297,167],{"class":89},[61,2299,288],{"class":85},[61,2301,2302],{"class":89},"(handler, msg);\n",[2207,2304],{},[2210,2306,2308],{"id":2307},"為什麼一個結構體可以像函數一樣調用","為什麼一個結構體可以像函數一樣調用？",[14,2310,2311,2312,2314],{},"因為 ",[18,2313,2204],{}," 重載了：",[52,2316,2318],{"className":54,"code":2317,"language":56,"meta":57,"style":57},"operator()\n",[18,2319,2320],{"__ignoreMap":57},[61,2321,2322],{"class":63,"line":64},[61,2323,2317],{"class":89},[14,2325,2139],{},[52,2327,2329],{"className":54,"code":2328,"language":56,"meta":57,"style":57},"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",[18,2330,2331,2337,2341,2363,2367,2391,2395],{"__ignoreMap":57},[61,2332,2333,2335],{"class":63,"line":64},[61,2334,1666],{"class":67},[61,2336,1756],{"class":85},[61,2338,2339],{"class":63,"line":115},[61,2340,492],{"class":89},[61,2342,2343,2345,2347,2349,2351,2353,2355,2357,2359,2361],{"class":63,"line":122},[61,2344,1765],{"class":67},[61,2346,1768],{"class":67},[61,2348,1771],{"class":85},[61,2350,173],{"class":89},[61,2352,815],{"class":67},[61,2354,1669],{"class":85},[61,2356,264],{"class":67},[61,2358,1782],{"class":297},[61,2360,1785],{"class":89},[61,2362,1788],{"class":67},[61,2364,2365],{"class":63,"line":142},[61,2366,892],{"class":89},[61,2368,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389],{"class":63,"line":157},[61,2370,897],{"class":85},[61,2372,543],{"class":89},[61,2374,546],{"class":67},[61,2376,1803],{"class":71},[61,2378,552],{"class":67},[61,2380,1808],{"class":89},[61,2382,546],{"class":67},[61,2384,570],{"class":71},[61,2386,573],{"class":131},[61,2388,576],{"class":71},[61,2390,536],{"class":89},[61,2392,2393],{"class":63,"line":185},[61,2394,926],{"class":89},[61,2396,2397],{"class":63,"line":190},[61,2398,1928],{"class":89},[14,2400,2401],{},"創建對象以後：",[52,2403,2404],{"className":54,"code":2242,"language":56,"meta":57,"style":57},[18,2405,2406],{"__ignoreMap":57},[61,2407,2408],{"class":63,"line":64},[61,2409,2242],{"class":89},[14,2411,2412],{},"就可以直接這樣調用：",[52,2414,2416],{"className":54,"code":2415,"language":56,"meta":57,"style":57},"handler(TextMessage{\"Hello\"});\n",[18,2417,2418],{"__ignoreMap":57},[61,2419,2420,2423,2426,2429],{"class":63,"line":64},[61,2421,2422],{"class":85},"handler",[61,2424,2425],{"class":89},"(TextMessage{",[61,2427,2428],{"class":71},"\"Hello\"",[61,2430,2431],{"class":89},"});\n",[14,2433,2434],{},"看起來像是在調用一個函數。",[14,2436,2437],{},"實際上等價於：",[52,2439,2441],{"className":54,"code":2440,"language":56,"meta":57,"style":57},"handler.operator()(TextMessage{\"Hello\"});\n",[18,2442,2443],{"__ignoreMap":57},[61,2444,2445,2448,2451,2454,2456],{"class":63,"line":64},[61,2446,2447],{"class":89},"handler.",[61,2449,2450],{"class":85},"operator",[61,2452,2453],{"class":89},"()(TextMessage{",[61,2455,2428],{"class":71},[61,2457,2431],{"class":89},[14,2459,2460],{},"所以這種重載了：",[52,2462,2463],{"className":54,"code":2317,"language":56,"meta":57,"style":57},[18,2464,2465],{"__ignoreMap":57},[61,2466,2467],{"class":63,"line":64},[61,2468,2317],{"class":89},[14,2470,2471],{},"的對象也叫：",[14,2473,2474,31],{},[28,2475,2476],{},"函數對象（Function Object \u002F Functor）",[2207,2478],{},[2210,2480,2482,2483,2486],{"id":2481},"為什麼這裡有三個-operator","為什麼這裡有三個 ",[18,2484,2485],{},"operator()","？",[14,2488,2489],{},"因為：",[52,2491,2493],{"className":54,"code":2492,"language":56,"meta":57,"style":57},"using Message =\n    std::variant\u003CTextMessage, NumberMessage, QuitMessage>;\n",[18,2494,2495,2504],{"__ignoreMap":57},[61,2496,2497,2499,2501],{"class":63,"line":64},[61,2498,1710],{"class":67},[61,2500,1713],{"class":85},[61,2502,2503],{"class":67}," =\n",[61,2505,2506,2508,2510,2512,2515,2517],{"class":63,"line":115},[61,2507,502],{"class":85},[61,2509,90],{"class":89},[61,2511,214],{"class":67},[61,2513,2514],{"class":89},"TextMessage, NumberMessage, QuitMessage",[61,2516,109],{"class":67},[61,2518,536],{"class":89},[14,2520,2521,2524],{},[18,2522,2523],{},"Message"," 可能保存三種不同的數據：",[52,2526,2528],{"className":54,"code":2527,"language":56,"meta":57,"style":57},"TextMessage\nNumberMessage\nQuitMessage\n",[18,2529,2530,2534,2539],{"__ignoreMap":57},[61,2531,2532],{"class":63,"line":64},[61,2533,2186],{"class":89},[61,2535,2536],{"class":63,"line":115},[61,2537,2538],{"class":89},"NumberMessage\n",[61,2540,2541],{"class":63,"line":122},[61,2542,2543],{"class":89},"QuitMessage\n",[14,2545,2195,2546,2548],{},[18,2547,2204],{}," 分別準備了三個處理函數：",[52,2550,2552],{"className":54,"code":2551,"language":56,"meta":57,"style":57},"void operator()(const TextMessage& msg) const\n{\n    std::cout \u003C\u003C \"Text: \" \u003C\u003C msg.text \u003C\u003C \"\\n\";\n}\n",[18,2553,2554,2576,2580,2604],{"__ignoreMap":57},[61,2555,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":63,"line":64},[61,2557,807],{"class":67},[61,2559,1768],{"class":67},[61,2561,1771],{"class":85},[61,2563,173],{"class":89},[61,2565,815],{"class":67},[61,2567,1669],{"class":85},[61,2569,264],{"class":67},[61,2571,1782],{"class":297},[61,2573,1785],{"class":89},[61,2575,1788],{"class":67},[61,2577,2578],{"class":63,"line":115},[61,2579,492],{"class":89},[61,2581,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602],{"class":63,"line":122},[61,2583,502],{"class":85},[61,2585,543],{"class":89},[61,2587,546],{"class":67},[61,2589,1803],{"class":71},[61,2591,552],{"class":67},[61,2593,1808],{"class":89},[61,2595,546],{"class":67},[61,2597,570],{"class":71},[61,2599,573],{"class":131},[61,2601,576],{"class":71},[61,2603,536],{"class":89},[61,2605,2606],{"class":63,"line":142},[61,2607,757],{"class":89},[14,2609,2610],{},"處理：",[52,2612,2613],{"className":54,"code":2186,"language":56,"meta":57,"style":57},[18,2614,2615],{"__ignoreMap":57},[61,2616,2617],{"class":63,"line":64},[61,2618,2186],{"class":89},[2207,2620],{},[52,2622,2624],{"className":54,"code":2623,"language":56,"meta":57,"style":57},"void operator()(const NumberMessage& msg) const\n{\n    std::cout \u003C\u003C \"Number: \" \u003C\u003C msg.number \u003C\u003C \"\\n\";\n}\n",[18,2625,2626,2648,2652,2676],{"__ignoreMap":57},[61,2627,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646],{"class":63,"line":64},[61,2629,807],{"class":67},[61,2631,1768],{"class":67},[61,2633,1771],{"class":85},[61,2635,173],{"class":89},[61,2637,815],{"class":67},[61,2639,1684],{"class":85},[61,2641,264],{"class":67},[61,2643,1782],{"class":297},[61,2645,1785],{"class":89},[61,2647,1788],{"class":67},[61,2649,2650],{"class":63,"line":115},[61,2651,492],{"class":89},[61,2653,2654,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674],{"class":63,"line":122},[61,2655,502],{"class":85},[61,2657,543],{"class":89},[61,2659,546],{"class":67},[61,2661,1859],{"class":71},[61,2663,552],{"class":67},[61,2665,1864],{"class":89},[61,2667,546],{"class":67},[61,2669,570],{"class":71},[61,2671,573],{"class":131},[61,2673,576],{"class":71},[61,2675,536],{"class":89},[61,2677,2678],{"class":63,"line":142},[61,2679,757],{"class":89},[14,2681,2610],{},[52,2683,2684],{"className":54,"code":2538,"language":56,"meta":57,"style":57},[18,2685,2686],{"__ignoreMap":57},[61,2687,2688],{"class":63,"line":64},[61,2689,2538],{"class":89},[2207,2691],{},[52,2693,2695],{"className":54,"code":2694,"language":56,"meta":57,"style":57},"void operator()(const QuitMessage&) const\n{\n    std::cout \u003C\u003C \"Quit!\\n\";\n}\n",[18,2696,2697,2717,2721,2737],{"__ignoreMap":57},[61,2698,2699,2701,2703,2705,2707,2709,2711,2713,2715],{"class":63,"line":64},[61,2700,807],{"class":67},[61,2702,1768],{"class":67},[61,2704,1771],{"class":85},[61,2706,173],{"class":89},[61,2708,815],{"class":67},[61,2710,1698],{"class":85},[61,2712,264],{"class":67},[61,2714,1785],{"class":89},[61,2716,1788],{"class":67},[61,2718,2719],{"class":63,"line":115},[61,2720,492],{"class":89},[61,2722,2723,2725,2727,2729,2731,2733,2735],{"class":63,"line":122},[61,2724,502],{"class":85},[61,2726,543],{"class":89},[61,2728,546],{"class":67},[61,2730,1913],{"class":71},[61,2732,573],{"class":131},[61,2734,576],{"class":71},[61,2736,536],{"class":89},[61,2738,2739],{"class":63,"line":142},[61,2740,757],{"class":89},[14,2742,2610],{},[52,2744,2745],{"className":54,"code":2543,"language":56,"meta":57,"style":57},[18,2746,2747],{"__ignoreMap":57},[61,2748,2749],{"class":63,"line":64},[61,2750,2543],{"class":89},[14,2752,2753],{},"它們雖然函數名都是：",[52,2755,2756],{"className":54,"code":2317,"language":56,"meta":57,"style":57},[18,2757,2758],{"__ignoreMap":57},[61,2759,2760],{"class":63,"line":64},[61,2761,2317],{"class":89},[14,2763,2764,2765,31],{},"但是參數類型不同，因此屬於",[28,2766,2767],{},"函數重載",[2207,2769],{},[2210,2771,2773,2775],{"id":2772},"stdvisit-到底做了什麼",[18,2774,2066],{}," 到底做了什麼？",[14,2777,2139],{},[52,2779,2781],{"className":54,"code":2780,"language":56,"meta":57,"style":57},"msg = TextMessage{\"Hello World\"};\n\nstd::visit(MessageHandler{}, msg);\n",[18,2782,2783,2795,2799],{"__ignoreMap":57},[61,2784,2785,2787,2789,2791,2793],{"class":63,"line":64},[61,2786,2158],{"class":89},[61,2788,128],{"class":67},[61,2790,1963],{"class":89},[61,2792,1966],{"class":71},[61,2794,1928],{"class":89},[61,2796,2797],{"class":63,"line":115},[61,2798,119],{"emptyLinePlaceholder":118},[61,2800,2801,2803,2805,2807],{"class":63,"line":122},[61,2802,86],{"class":85},[61,2804,167],{"class":89},[61,2806,288],{"class":85},[61,2808,1979],{"class":89},[14,2810,2179,2811,2813],{},[18,2812,2182],{}," 保存的是：",[52,2815,2816],{"className":54,"code":2186,"language":56,"meta":57,"style":57},[18,2817,2818],{"__ignoreMap":57},[61,2819,2820],{"class":63,"line":64},[61,2821,2186],{"class":89},[14,2823,2824,2825,2827],{},"可以粗略理解為 ",[18,2826,2066],{}," 做了：",[52,2829,2831],{"className":54,"code":2830,"language":56,"meta":57,"style":57},"MessageHandler{}(TextMessage{\"Hello World\"});\n",[18,2832,2833],{"__ignoreMap":57},[61,2834,2835,2838,2840],{"class":63,"line":64},[61,2836,2837],{"class":89},"MessageHandler{}(TextMessage{",[61,2839,1966],{"class":71},[61,2841,2431],{"class":89},[14,2843,2844],{},"於是編譯器找到：",[52,2846,2848],{"className":54,"code":2847,"language":56,"meta":57,"style":57},"void operator()(const TextMessage& msg) const\n",[18,2849,2850],{"__ignoreMap":57},[61,2851,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870],{"class":63,"line":64},[61,2853,807],{"class":67},[61,2855,1768],{"class":67},[61,2857,1771],{"class":85},[61,2859,173],{"class":89},[61,2861,815],{"class":67},[61,2863,1669],{"class":85},[61,2865,264],{"class":67},[61,2867,1782],{"class":297},[61,2869,1785],{"class":89},[61,2871,1788],{"class":67},[14,2873,2874],{},"最終輸出：",[52,2876,2879],{"className":2877,"code":2878,"language":769,"meta":57},[767],"Text: Hello World\n",[18,2880,2878],{"__ignoreMap":57},[2207,2882],{},[14,2884,2885],{},"再例如：",[52,2887,2889],{"className":54,"code":2888,"language":56,"meta":57,"style":57},"msg = NumberMessage{42};\n\nstd::visit(MessageHandler{}, msg);\n",[18,2890,2891,2903,2907],{"__ignoreMap":57},[61,2892,2893,2895,2897,2899,2901],{"class":63,"line":64},[61,2894,2158],{"class":89},[61,2896,128],{"class":67},[61,2898,1992],{"class":89},[61,2900,1995],{"class":131},[61,2902,1928],{"class":89},[61,2904,2905],{"class":63,"line":115},[61,2906,119],{"emptyLinePlaceholder":118},[61,2908,2909,2911,2913,2915],{"class":63,"line":122},[61,2910,86],{"class":85},[61,2912,167],{"class":89},[61,2914,288],{"class":85},[61,2916,1979],{"class":89},[14,2918,2919],{},"可以粗略理解成：",[52,2921,2923],{"className":54,"code":2922,"language":56,"meta":57,"style":57},"MessageHandler{}(NumberMessage{42});\n",[18,2924,2925],{"__ignoreMap":57},[61,2926,2927,2930,2932],{"class":63,"line":64},[61,2928,2929],{"class":89},"MessageHandler{}(NumberMessage{",[61,2931,1995],{"class":131},[61,2933,2431],{"class":89},[14,2935,2936],{},"於是調用：",[52,2938,2940],{"className":54,"code":2939,"language":56,"meta":57,"style":57},"void operator()(const NumberMessage& msg) const\n",[18,2941,2942],{"__ignoreMap":57},[61,2943,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962],{"class":63,"line":64},[61,2945,807],{"class":67},[61,2947,1768],{"class":67},[61,2949,1771],{"class":85},[61,2951,173],{"class":89},[61,2953,815],{"class":67},[61,2955,1684],{"class":85},[61,2957,264],{"class":67},[61,2959,1782],{"class":297},[61,2961,1785],{"class":89},[61,2963,1788],{"class":67},[14,2965,2966],{},"輸出：",[52,2968,2971],{"className":2969,"code":2970,"language":769,"meta":57},[767],"Number: 42\n",[18,2972,2970],{"__ignoreMap":57},[2207,2974],{},[14,2976,2977],{},"最後：",[52,2979,2981],{"className":54,"code":2980,"language":56,"meta":57,"style":57},"msg = QuitMessage{};\n\nstd::visit(MessageHandler{}, msg);\n",[18,2982,2983,2991,2995],{"__ignoreMap":57},[61,2984,2985,2987,2989],{"class":63,"line":64},[61,2986,2158],{"class":89},[61,2988,128],{"class":67},[61,2990,2020],{"class":89},[61,2992,2993],{"class":63,"line":115},[61,2994,119],{"emptyLinePlaceholder":118},[61,2996,2997,2999,3001,3003],{"class":63,"line":122},[61,2998,86],{"class":85},[61,3000,167],{"class":89},[61,3002,288],{"class":85},[61,3004,1979],{"class":89},[14,3006,3007],{},"則會選擇：",[52,3009,3011],{"className":54,"code":3010,"language":56,"meta":57,"style":57},"void operator()(const QuitMessage&) const\n",[18,3012,3013],{"__ignoreMap":57},[61,3014,3015,3017,3019,3021,3023,3025,3027,3029,3031],{"class":63,"line":64},[61,3016,807],{"class":67},[61,3018,1768],{"class":67},[61,3020,1771],{"class":85},[61,3022,173],{"class":89},[61,3024,815],{"class":67},[61,3026,1698],{"class":85},[61,3028,264],{"class":67},[61,3030,1785],{"class":89},[61,3032,1788],{"class":67},[14,3034,2966],{},[52,3036,3039],{"className":3037,"code":3038,"language":769,"meta":57},[767],"Quit!\n",[18,3040,3038],{"__ignoreMap":57},[14,3042,3043],{},"整個過程可以理解為：",[52,3045,3048],{"className":3046,"code":3047,"language":769,"meta":57},[767],"                         std::variant\n                              │\n              ┌───────────────┼───────────────┐\n              │               │               │\n       TextMessage      NumberMessage     QuitMessage\n              │               │               │\n              ▼               ▼               ▼\n operator(TextMessage) operator(NumberMessage) operator(QuitMessage)\n",[18,3049,3047],{"__ignoreMap":57},[14,3051,3052,3054],{},[18,3053,2066],{}," 的作用就是：",[3056,3057,3058],"blockquote",{},[14,3059,3060,3061,3063],{},"查看 ",[18,3062,822],{}," 當前保存的是哪一種類型，然後自動調用 visitor 中能夠處理這個類型的函數。",[2207,3065],{},[2210,3067,3069,3071],{"id":3068},"stdvisit-第一個參數必須是結構體嗎",[18,3070,2066],{}," 第一個參數必須是結構體嗎？",[14,3073,3074],{},"不是。",[14,3076,3077,3079],{},[18,3078,2066],{}," 第一個參數本質上只要求是一個：",[14,3081,3082,31],{},[28,3083,2128],{},[14,3085,3086],{},"也就是說，只要一個東西能夠像下面這樣調用：",[52,3088,3090],{"className":54,"code":3089,"language":56,"meta":57,"style":57},"对象(参数);\n",[18,3091,3092],{"__ignoreMap":57},[61,3093,3094],{"class":63,"line":64},[61,3095,3089],{"class":89},[14,3097,3098],{},"就可以作為 visitor。",[14,3100,3101],{},"常見的可調用對象包括：",[52,3103,3106],{"className":3104,"code":3105,"language":769,"meta":57},[767],"普通函数\nLambda\n函数对象（重载 operator() 的 class \u002F struct）\nstd::function\n",[18,3107,3105],{"__ignoreMap":57},[14,3109,3110],{},"上面的例子使用的是：",[52,3112,3113],{"className":54,"code":2222,"language":56,"meta":57,"style":57},[18,3114,3115],{"__ignoreMap":57},[61,3116,3117],{"class":63,"line":64},[61,3118,2222],{"class":89},[14,3120,3121],{},"它屬於：",[52,3123,3126],{"className":3124,"code":3125,"language":769,"meta":57},[767],"结构体对象\n    ↓\n重载 operator()\n    ↓\n函数对象 Functor\n    ↓\n可以作为 std::visit 的 Visitor\n",[18,3127,3125],{"__ignoreMap":57},[2207,3129],{},[2210,3131,3133],{"id":3132},"lambda-為什麼也能作為-visitor","Lambda 為什麼也能作為 Visitor？",[14,3135,2139],{},[52,3137,3139],{"className":54,"code":3138,"language":56,"meta":57,"style":57},"std::visit(\n    [](const auto& msg)\n    {\n        std::cout \u003C\u003C \"收到一条消息\\n\";\n    },\n    msg\n);\n",[18,3140,3141,3152,3165,3169,3186,3191,3196],{"__ignoreMap":57},[61,3142,3143,3145,3147,3149],{"class":63,"line":64},[61,3144,86],{"class":85},[61,3146,167],{"class":89},[61,3148,288],{"class":85},[61,3150,3151],{"class":89},"(\n",[61,3153,3154,3157,3159,3161,3163],{"class":63,"line":115},[61,3155,3156],{"class":89},"    [](",[61,3158,815],{"class":67},[61,3160,1304],{"class":67},[61,3162,1782],{"class":297},[61,3164,848],{"class":89},[61,3166,3167],{"class":63,"line":122},[61,3168,892],{"class":89},[61,3170,3171,3173,3175,3177,3180,3182,3184],{"class":63,"line":142},[61,3172,897],{"class":85},[61,3174,543],{"class":89},[61,3176,546],{"class":67},[61,3178,3179],{"class":71}," \"收到一条消息",[61,3181,573],{"class":131},[61,3183,576],{"class":71},[61,3185,536],{"class":89},[61,3187,3188],{"class":63,"line":157},[61,3189,3190],{"class":89},"    },\n",[61,3192,3193],{"class":63,"line":185},[61,3194,3195],{"class":89},"    msg\n",[61,3197,3198],{"class":63,"line":190},[61,3199,650],{"class":89},[14,3201,3202],{},"這裡第一個參數就是一個 Lambda。",[14,3204,3205],{},"Lambda 本身也是一種可調用對象。",[14,3207,2139],{},[52,3209,3211],{"className":54,"code":3210,"language":56,"meta":57,"style":57},"auto f = [](int x)\n{\n    std::cout \u003C\u003C x \u003C\u003C \"\\n\";\n};\n\nf(10);\n",[18,3212,3213,3232,3236,3257,3261,3265],{"__ignoreMap":57},[61,3214,3215,3218,3221,3223,3225,3227,3230],{"class":63,"line":64},[61,3216,3217],{"class":67},"auto",[61,3219,3220],{"class":89}," f ",[61,3222,128],{"class":67},[61,3224,1299],{"class":89},[61,3226,199],{"class":67},[61,3228,3229],{"class":297}," x",[61,3231,848],{"class":89},[61,3233,3234],{"class":63,"line":115},[61,3235,492],{"class":89},[61,3237,3238,3240,3242,3244,3247,3249,3251,3253,3255],{"class":63,"line":122},[61,3239,502],{"class":85},[61,3241,543],{"class":89},[61,3243,546],{"class":67},[61,3245,3246],{"class":89}," x ",[61,3248,546],{"class":67},[61,3250,570],{"class":71},[61,3252,573],{"class":131},[61,3254,576],{"class":71},[61,3256,536],{"class":89},[61,3258,3259],{"class":63,"line":142},[61,3260,1928],{"class":89},[61,3262,3263],{"class":63,"line":157},[61,3264,119],{"emptyLinePlaceholder":118},[61,3266,3267,3270,3272,3275],{"class":63,"line":185},[61,3268,3269],{"class":85},"f",[61,3271,173],{"class":89},[61,3273,3274],{"class":131},"10",[61,3276,650],{"class":89},[14,3278,3279],{},"能夠像函數一樣調用：",[52,3281,3283],{"className":54,"code":3282,"language":56,"meta":57,"style":57},"f(10);\n",[18,3284,3285],{"__ignoreMap":57},[61,3286,3287,3289,3291,3293],{"class":63,"line":64},[61,3288,3269],{"class":85},[61,3290,173],{"class":89},[61,3292,3274],{"class":131},[61,3294,650],{"class":89},[14,3296,3297],{},"因此它也可以傳給：",[52,3299,3301],{"className":54,"code":3300,"language":56,"meta":57,"style":57},"std::visit\n",[18,3302,3303],{"__ignoreMap":57},[61,3304,3305,3307],{"class":63,"line":64},[61,3306,86],{"class":85},[61,3308,3309],{"class":89},"::visit\n",[14,3311,3312],{},"實際上，可以把 Lambda 粗略理解成編譯器自動生成了一個匿名的函數對象：",[52,3314,3316],{"className":54,"code":3315,"language":56,"meta":57,"style":57},"struct 某个匿名类型\n{\n    void operator()(int x) const\n    {\n        std::cout \u003C\u003C x \u003C\u003C \"\\n\";\n    }\n};\n",[18,3317,3318,3325,3329,3347,3351,3371,3375],{"__ignoreMap":57},[61,3319,3320,3322],{"class":63,"line":64},[61,3321,1666],{"class":67},[61,3323,3324],{"class":89}," 某个匿名类型\n",[61,3326,3327],{"class":63,"line":115},[61,3328,492],{"class":89},[61,3330,3331,3333,3335,3337,3339,3341,3343,3345],{"class":63,"line":122},[61,3332,1765],{"class":67},[61,3334,1768],{"class":67},[61,3336,1771],{"class":85},[61,3338,173],{"class":89},[61,3340,199],{"class":67},[61,3342,3229],{"class":297},[61,3344,1785],{"class":89},[61,3346,1788],{"class":67},[61,3348,3349],{"class":63,"line":142},[61,3350,892],{"class":89},[61,3352,3353,3355,3357,3359,3361,3363,3365,3367,3369],{"class":63,"line":157},[61,3354,897],{"class":85},[61,3356,543],{"class":89},[61,3358,546],{"class":67},[61,3360,3246],{"class":89},[61,3362,546],{"class":67},[61,3364,570],{"class":71},[61,3366,573],{"class":131},[61,3368,576],{"class":71},[61,3370,536],{"class":89},[61,3372,3373],{"class":63,"line":185},[61,3374,926],{"class":89},[61,3376,3377],{"class":63,"line":190},[61,3378,1928],{"class":89},[14,3380,3381],{},"所以從思想上來說：",[52,3383,3385],{"className":54,"code":3384,"language":56,"meta":57,"style":57},"Lambda\n",[18,3386,3387],{"__ignoreMap":57},[61,3388,3389],{"class":63,"line":64},[61,3390,3384],{"class":89},[14,3392,2251],{},[52,3394,3396],{"className":54,"code":3395,"language":56,"meta":57,"style":57},"重载了 operator() 的 struct\u002Fclass\n",[18,3397,3398],{"__ignoreMap":57},[61,3399,3400,3403,3405],{"class":63,"line":64},[61,3401,3402],{"class":89},"重载了 operator() 的 ",[61,3404,1666],{"class":67},[61,3406,3407],{"class":89},"\u002Fclass\n",[14,3409,3410],{},"非常相似。",[2207,3412],{},[2210,3414,3416],{"id":3415},"為什麼這個例子更適合用結構體-visitor","為什麼這個例子更適合用結構體 Visitor？",[14,3418,3419],{},"如果只有一種簡單操作，Lambda 很方便：",[52,3421,3423],{"className":54,"code":3422,"language":56,"meta":57,"style":57},"[](const auto& value)\n{\n    \u002F\u002F ...\n}\n",[18,3424,3425,3439,3443,3448],{"__ignoreMap":57},[61,3426,3427,3430,3432,3434,3437],{"class":63,"line":64},[61,3428,3429],{"class":89},"[](",[61,3431,815],{"class":67},[61,3433,1304],{"class":67},[61,3435,3436],{"class":297}," value",[61,3438,848],{"class":89},[61,3440,3441],{"class":63,"line":115},[61,3442,492],{"class":89},[61,3444,3445],{"class":63,"line":122},[61,3446,3447],{"class":138},"    \u002F\u002F ...\n",[61,3449,3450],{"class":63,"line":142},[61,3451,757],{"class":89},[14,3453,3454],{},"但是這裡需要針對不同類型執行完全不同的邏輯：",[52,3456,3457],{"className":54,"code":2527,"language":56,"meta":57,"style":57},[18,3458,3459,3463,3467],{"__ignoreMap":57},[61,3460,3461],{"class":63,"line":64},[61,3462,2186],{"class":89},[61,3464,3465],{"class":63,"line":115},[61,3466,2538],{"class":89},[61,3468,3469],{"class":63,"line":122},[61,3470,2543],{"class":89},[14,3472,3473,3474,3476],{},"使用多個 ",[18,3475,2485],{}," 重載會非常直觀：",[52,3478,3480],{"className":54,"code":3479,"language":56,"meta":57,"style":57},"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",[18,3481,3482,3488,3492,3514,3518,3523,3527,3531,3553,3557,3562,3566,3570,3590,3594,3599,3603],{"__ignoreMap":57},[61,3483,3484,3486],{"class":63,"line":64},[61,3485,1666],{"class":67},[61,3487,1756],{"class":85},[61,3489,3490],{"class":63,"line":115},[61,3491,492],{"class":89},[61,3493,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512],{"class":63,"line":122},[61,3495,1765],{"class":67},[61,3497,1768],{"class":67},[61,3499,1771],{"class":85},[61,3501,173],{"class":89},[61,3503,815],{"class":67},[61,3505,1669],{"class":85},[61,3507,264],{"class":67},[61,3509,1782],{"class":297},[61,3511,1785],{"class":89},[61,3513,1788],{"class":67},[61,3515,3516],{"class":63,"line":142},[61,3517,892],{"class":89},[61,3519,3520],{"class":63,"line":157},[61,3521,3522],{"class":138},"        \u002F\u002F 处理文本消息\n",[61,3524,3525],{"class":63,"line":185},[61,3526,926],{"class":89},[61,3528,3529],{"class":63,"line":190},[61,3530,119],{"emptyLinePlaceholder":118},[61,3532,3533,3535,3537,3539,3541,3543,3545,3547,3549,3551],{"class":63,"line":196},[61,3534,1765],{"class":67},[61,3536,1768],{"class":67},[61,3538,1771],{"class":85},[61,3540,173],{"class":89},[61,3542,815],{"class":67},[61,3544,1684],{"class":85},[61,3546,264],{"class":67},[61,3548,1782],{"class":297},[61,3550,1785],{"class":89},[61,3552,1788],{"class":67},[61,3554,3555],{"class":63,"line":222},[61,3556,892],{"class":89},[61,3558,3559],{"class":63,"line":227},[61,3560,3561],{"class":138},"        \u002F\u002F 处理数字消息\n",[61,3563,3564],{"class":63,"line":233},[61,3565,926],{"class":89},[61,3567,3568],{"class":63,"line":270},[61,3569,119],{"emptyLinePlaceholder":118},[61,3571,3572,3574,3576,3578,3580,3582,3584,3586,3588],{"class":63,"line":275},[61,3573,1765],{"class":67},[61,3575,1768],{"class":67},[61,3577,1771],{"class":85},[61,3579,173],{"class":89},[61,3581,815],{"class":67},[61,3583,1698],{"class":85},[61,3585,264],{"class":67},[61,3587,1785],{"class":89},[61,3589,1788],{"class":67},[61,3591,3592],{"class":63,"line":281},[61,3593,892],{"class":89},[61,3595,3596],{"class":63,"line":304},[61,3597,3598],{"class":138},"        \u002F\u002F 处理退出消息\n",[61,3600,3601],{"class":63,"line":309},[61,3602,926],{"class":89},[61,3604,3605],{"class":63,"line":315},[61,3606,1928],{"class":89},[14,3608,3609],{},"這樣每種消息類型都有自己獨立的處理邏輯。",[2207,3611],{},[2210,3613,3614],{"id":3614},"核心理解",[14,3616,3617],{},"可以把：",[52,3619,3620],{"className":54,"code":2073,"language":56,"meta":57,"style":57},[18,3621,3622],{"__ignoreMap":57},[61,3623,3624,3626,3628,3630],{"class":63,"line":64},[61,3625,86],{"class":85},[61,3627,167],{"class":89},[61,3629,288],{"class":85},[61,3631,1979],{"class":89},[14,3633,3634],{},"拆成兩個部分理解。",[14,3636,3637],{},"首先：",[52,3639,3640],{"className":54,"code":2222,"language":56,"meta":57,"style":57},[18,3641,3642],{"__ignoreMap":57},[61,3643,3644],{"class":63,"line":64},[61,3645,2222],{"class":89},[14,3647,3648],{},"表示：",[52,3650,3653],{"className":3651,"code":3652,"language":769,"meta":57},[767],"创建一个 MessageHandler 临时对象\n",[18,3654,3652],{"__ignoreMap":57},[14,3656,3657],{},"由於它重載了：",[52,3659,3660],{"className":54,"code":2317,"language":56,"meta":57,"style":57},[18,3661,3662],{"__ignoreMap":57},[61,3663,3664],{"class":63,"line":64},[61,3665,2317],{"class":89},[14,3667,3668],{},"所以它是一個可調用對象。",[14,3670,3671],{},"然後：",[52,3673,3675],{"className":54,"code":3674,"language":56,"meta":57,"style":57},"std::visit(..., msg);\n",[18,3676,3677],{"__ignoreMap":57},[61,3678,3679,3681,3683,3685],{"class":63,"line":64},[61,3680,86],{"class":85},[61,3682,167],{"class":89},[61,3684,288],{"class":85},[61,3686,3687],{"class":89},"(..., msg);\n",[14,3689,3690],{},"負責：",[52,3692,3695],{"className":3693,"code":3694,"language":769,"meta":57},[767],"查看 msg 当前保存的类型\n        ↓\n取出对应的数据\n        ↓\n调用 MessageHandler 对应的 operator()\n",[18,3696,3694],{"__ignoreMap":57},[14,3698,2265],{},[52,3700,3701],{"className":54,"code":2073,"language":56,"meta":57,"style":57},[18,3702,3703],{"__ignoreMap":57},[61,3704,3705,3707,3709,3711],{"class":63,"line":64},[61,3706,86],{"class":85},[61,3708,167],{"class":89},[61,3710,288],{"class":85},[61,3712,1979],{"class":89},[14,3714,3715],{},"可以概括成一句話：",[3056,3717,3718],{},[14,3719,3720,3721,3723,3724,3726,3727,3729],{},"根據 ",[18,3722,2182],{}," 當前保存的數據類型，讓 ",[18,3725,2204],{}," 自動選擇對應的 ",[18,3728,2485],{}," 進行處理。",[14,3731,3732],{},"也可以記成：",[52,3734,3736],{"className":54,"code":3735,"language":56,"meta":57,"style":57},"std::visit(visitor, variant);\n",[18,3737,3738],{"__ignoreMap":57},[61,3739,3740,3742,3744,3746],{"class":63,"line":64},[61,3741,86],{"class":85},[61,3743,167],{"class":89},[61,3745,288],{"class":85},[61,3747,3748],{"class":89},"(visitor, variant);\n",[14,3750,3751],{},"即：",[52,3753,3756],{"className":3754,"code":3755,"language":769,"meta":57},[767],"visit\n │\n ├── 看 variant 当前是什么类型\n │\n ├── 把里面的数据取出来\n │\n └── 用这个数据调用 visitor\n",[18,3757,3755],{"__ignoreMap":57},[14,3759,3760],{},"其中 visitor 並不是某一種固定語法，而是任何能夠被調用的對象。",[14,3762,3763],{},"在本例中：",[52,3765,3766],{"className":54,"code":2222,"language":56,"meta":57,"style":57},[18,3767,3768],{"__ignoreMap":57},[61,3769,3770],{"class":63,"line":64},[61,3771,2222],{"class":89},[14,3773,3774,3775,3777],{},"就是一個通過重載 ",[18,3776,2485],{}," 實現的函數對象。",[10,3779,762],{"id":762},[14,3781,3782],{},"見上方每個示例的\"運行結果\"。",[10,3784,3785],{"id":3785},"示例中的關鍵語法解釋",[340,3787,3788,3807],{},[343,3789,3790],{},[346,3791,3792,3795,3798,3801,3804],{},[349,3793,3794],{"align":351},"示例",[349,3796,3797],{"align":351},"講了什麼",[349,3799,3800],{"align":351},"新出現的語法",[349,3802,3803],{"align":351},"為什麼這樣寫",[349,3805,3806],{"align":351},"注意事項",[357,3808,3809,3834,3852,3871],{},[346,3810,3811,3814,3817,3825,3828],{},[362,3812,3813],{"align":351},"示例 1",[362,3815,3816],{"align":351},"基本賦值和 get",[362,3818,3819,3822,3823],{"align":351},[18,3820,3821],{},"std::variant\u003Cint, double, string>","、",[18,3824,386],{},[362,3826,3827],{"align":351},"variant 類型安全，賦值時自動切換類型",[362,3829,3830,3833],{"align":351},[18,3831,3832],{},"get\u003CT>"," 類型不對會拋異常",[346,3835,3836,3839,3842,3846,3849],{},[362,3837,3838],{"align":351},"示例 2",[362,3840,3841],{"align":351},"get_if 安全訪問",[362,3843,3844],{"align":351},[18,3845,400],{},[362,3847,3848],{"align":351},"返回指針，類型不對返回 nullptr",[362,3850,3851],{"align":351},"比 get 更安全，推薦使用",[346,3853,3854,3857,3860,3865,3868],{},[362,3855,3856],{"align":351},"示例 3",[362,3858,3859],{"align":351},"visit 模式",[362,3861,3862],{"align":351},[18,3863,3864],{},"std::visit(lambda, v)",[362,3866,3867],{"align":351},"visit 強制覆蓋所有類型，是 variant 的最佳訪問方式",[362,3869,3870],{"align":351},"泛型 lambda + visit 是最簡潔的組合",[346,3872,3873,3876,3879,3882,3885],{},[362,3874,3875],{"align":351},"示例 4",[362,3877,3878],{"align":351},"消息分發模式",[362,3880,3881],{"align":351},"struct visitor + variant",[362,3883,3884],{"align":351},"用 variant + visitor 實現類型安全的消息處理",[362,3886,3887],{"align":351},"visitor 必須為每種類型都提供 operator()",[10,3889,3891],{"id":3890},"variant-適合有限幾種類型之一","variant 適合\"有限幾種類型之一\"",[14,3893,3894,3896],{},[18,3895,822],{}," 不是為了替代所有繼承和多態。它最適合這種情況：類型種類有限，而且你希望編譯器提醒你把每種情況都處理掉。",[340,3898,3899,3909],{},[343,3900,3901],{},[346,3902,3903,3906],{},[349,3904,3905],{"align":351},"場景",[349,3907,3908],{"align":351},"推薦",[357,3910,3911,3920,3929,3938,3946],{},[346,3912,3913,3916],{},[362,3914,3915],{"align":351},"消息只有 Text \u002F Number \u002F Quit 三類",[362,3917,3918],{"align":351},[18,3919,5],{},[346,3921,3922,3925],{},[362,3923,3924],{"align":351},"狀態只有 Idle \u002F Running \u002F Error 幾類",[362,3926,3927],{"align":351},[18,3928,5],{},[346,3930,3931,3934],{},[362,3932,3933],{"align":351},"解析結果可能是 int \u002F double \u002F string",[362,3935,3936],{"align":351},[18,3937,5],{},[346,3939,3940,3943],{},[362,3941,3942],{"align":351},"類型種類很多且需要運行時擴展插件",[362,3944,3945],{"align":351},"繼承 + 虛函數",[346,3947,3948,3951],{},[362,3949,3950],{"align":351},"所有對象共享一套接口",[362,3952,3953],{"align":351},"多態接口更自然",[438,3955,3957],{"id":3956},"示例-5用-variant-表示狀態機","示例 5：用 variant 表示狀態機",[52,3959,3961],{"className":54,"code":3960,"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,3962,3963,3969,3975,3981,3987,3991,4000,4007,4011,4019,4023,4030,4034,4041,4045,4049,4054,4086,4090,4110,4114,4119,4138,4162,4166,4187,4191,4209,4213,4237,4241,4267,4271,4294,4298,4324,4328,4333,4337,4341,4349,4353,4358,4368,4377,4382,4397,4404,4409,4424,4431,4436,4445],{"__ignoreMap":57},[61,3964,3965,3967],{"class":63,"line":64},[61,3966,68],{"class":67},[61,3968,453],{"class":71},[61,3970,3971,3973],{"class":63,"line":115},[61,3972,68],{"class":67},[61,3974,466],{"class":71},[61,3976,3977,3979],{"class":63,"line":122},[61,3978,68],{"class":67},[61,3980,473],{"class":71},[61,3982,3983,3985],{"class":63,"line":142},[61,3984,68],{"class":67},[61,3986,72],{"class":71},[61,3988,3989],{"class":63,"line":157},[61,3990,119],{"emptyLinePlaceholder":118},[61,3992,3993,3995,3998],{"class":63,"line":185},[61,3994,1666],{"class":67},[61,3996,3997],{"class":85}," Idle",[61,3999,1701],{"class":89},[61,4001,4002,4004],{"class":63,"line":190},[61,4003,1666],{"class":67},[61,4005,4006],{"class":85}," Running\n",[61,4008,4009],{"class":63,"line":196},[61,4010,492],{"class":89},[61,4012,4013,4016],{"class":63,"line":222},[61,4014,4015],{"class":67},"    int",[61,4017,4018],{"class":89}," task_id;\n",[61,4020,4021],{"class":63,"line":227},[61,4022,1928],{"class":89},[61,4024,4025,4027],{"class":63,"line":233},[61,4026,1666],{"class":67},[61,4028,4029],{"class":85}," Error\n",[61,4031,4032],{"class":63,"line":270},[61,4033,492],{"class":89},[61,4035,4036,4038],{"class":63,"line":275},[61,4037,502],{"class":85},[61,4039,4040],{"class":89},"::string message;\n",[61,4042,4043],{"class":63,"line":281},[61,4044,1928],{"class":89},[61,4046,4047],{"class":63,"line":304},[61,4048,119],{"emptyLinePlaceholder":118},[61,4050,4051],{"class":63,"line":309},[61,4052,4053],{"class":138},"\u002F\u002F variant 表示一个变量可以在多个候选类型中保存其中一种。\n",[61,4055,4056,4058,4061,4063,4065,4067,4069,4071,4074,4076,4079,4081,4084],{"class":63,"line":315},[61,4057,1710],{"class":67},[61,4059,4060],{"class":85}," State",[61,4062,1716],{"class":67},[61,4064,164],{"class":85},[61,4066,167],{"class":89},[61,4068,822],{"class":85},[61,4070,214],{"class":89},[61,4072,4073],{"class":85},"Idle",[61,4075,96],{"class":89},[61,4077,4078],{"class":85},"Running",[61,4080,96],{"class":89},[61,4082,4083],{"class":85},"Error",[61,4085,1740],{"class":89},[61,4087,4088],{"class":63,"line":653},[61,4089,119],{"emptyLinePlaceholder":118},[61,4091,4092,4094,4097,4099,4101,4103,4105,4108],{"class":63,"line":693},[61,4093,807],{"class":67},[61,4095,4096],{"class":85}," print_state",[61,4098,173],{"class":89},[61,4100,815],{"class":67},[61,4102,4060],{"class":85},[61,4104,264],{"class":67},[61,4106,4107],{"class":297}," state",[61,4109,848],{"class":89},[61,4111,4112],{"class":63,"line":698},[61,4113,492],{"class":89},[61,4115,4116],{"class":63,"line":704},[61,4117,4118],{"class":138},"    \u002F\u002F visit 会根据 variant 当前保存的类型调用对应处理逻辑。\n",[61,4120,4121,4123,4125,4127,4129,4131,4133,4136],{"class":63,"line":738},[61,4122,502],{"class":85},[61,4124,167],{"class":89},[61,4126,288],{"class":85},[61,4128,291],{"class":89},[61,4130,815],{"class":67},[61,4132,1304],{"class":67},[61,4134,4135],{"class":297}," s",[61,4137,1309],{"class":89},[61,4139,4140,4143,4146,4148,4150,4152,4154,4156,4159],{"class":63,"line":743},[61,4141,4142],{"class":67},"        using",[61,4144,4145],{"class":85}," T",[61,4147,1716],{"class":67},[61,4149,164],{"class":85},[61,4151,167],{"class":89},[61,4153,1481],{"class":131},[61,4155,214],{"class":89},[61,4157,4158],{"class":67},"decltype",[61,4160,4161],{"class":89},"(s)>;\n",[61,4163,4164],{"class":63,"line":754},[61,4165,119],{"emptyLinePlaceholder":118},[61,4167,4168,4170,4172,4174,4176,4178,4180,4183,4185],{"class":63,"line":1105},[61,4169,1462],{"class":67},[61,4171,1465],{"class":67},[61,4173,239],{"class":89},[61,4175,86],{"class":85},[61,4177,1472],{"class":89},[61,4179,214],{"class":67},[61,4181,4182],{"class":89},"T, Idle",[61,4184,109],{"class":67},[61,4186,848],{"class":89},[61,4188,4189],{"class":63,"line":1110},[61,4190,1504],{"class":89},[61,4192,4193,4196,4198,4200,4203,4205,4207],{"class":63,"line":1121},[61,4194,4195],{"class":85},"            std",[61,4197,543],{"class":89},[61,4199,546],{"class":67},[61,4201,4202],{"class":71}," \"state: idle",[61,4204,573],{"class":131},[61,4206,576],{"class":71},[61,4208,536],{"class":89},[61,4210,4211],{"class":63,"line":1130},[61,4212,1522],{"class":89},[61,4214,4215,4218,4220,4222,4224,4226,4228,4230,4233,4235],{"class":63,"line":1135},[61,4216,4217],{"class":67},"        else",[61,4219,934],{"class":67},[61,4221,1465],{"class":67},[61,4223,239],{"class":89},[61,4225,86],{"class":85},[61,4227,1472],{"class":89},[61,4229,214],{"class":67},[61,4231,4232],{"class":89},"T, Running",[61,4234,109],{"class":67},[61,4236,848],{"class":89},[61,4238,4239],{"class":63,"line":1147},[61,4240,1504],{"class":89},[61,4242,4243,4245,4247,4249,4252,4254,4257,4259,4261,4263,4265],{"class":63,"line":1154},[61,4244,4195],{"class":85},[61,4246,543],{"class":89},[61,4248,546],{"class":67},[61,4250,4251],{"class":71}," \"state: running task \"",[61,4253,552],{"class":67},[61,4255,4256],{"class":89}," s.task_id ",[61,4258,546],{"class":67},[61,4260,570],{"class":71},[61,4262,573],{"class":131},[61,4264,576],{"class":71},[61,4266,536],{"class":89},[61,4268,4269],{"class":63,"line":1159},[61,4270,1522],{"class":89},[61,4272,4273,4275,4277,4279,4281,4283,4285,4287,4290,4292],{"class":63,"line":1179},[61,4274,4217],{"class":67},[61,4276,934],{"class":67},[61,4278,1465],{"class":67},[61,4280,239],{"class":89},[61,4282,86],{"class":85},[61,4284,1472],{"class":89},[61,4286,214],{"class":67},[61,4288,4289],{"class":89},"T, Error",[61,4291,109],{"class":67},[61,4293,848],{"class":89},[61,4295,4296],{"class":63,"line":1186},[61,4297,1504],{"class":89},[61,4299,4300,4302,4304,4306,4309,4311,4314,4316,4318,4320,4322],{"class":63,"line":1191},[61,4301,4195],{"class":85},[61,4303,543],{"class":89},[61,4305,546],{"class":67},[61,4307,4308],{"class":71}," \"state: error \"",[61,4310,552],{"class":67},[61,4312,4313],{"class":89}," s.message ",[61,4315,546],{"class":67},[61,4317,570],{"class":71},[61,4319,573],{"class":131},[61,4321,576],{"class":71},[61,4323,536],{"class":89},[61,4325,4326],{"class":63,"line":1200},[61,4327,1522],{"class":89},[61,4329,4330],{"class":63,"line":1599},[61,4331,4332],{"class":89},"    }, state);\n",[61,4334,4335],{"class":63,"line":1604},[61,4336,757],{"class":89},[61,4338,4339],{"class":63,"line":1613},[61,4340,119],{"emptyLinePlaceholder":118},[61,4342,4343,4345,4347],{"class":63,"line":2023},[61,4344,199],{"class":67},[61,4346,484],{"class":85},[61,4348,487],{"class":89},[61,4350,4351],{"class":63,"line":2034},[61,4352,492],{"class":89},[61,4354,4355],{"class":63,"line":2039},[61,4356,4357],{"class":138},"    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[61,4359,4360,4363,4365],{"class":63,"line":2048},[61,4361,4362],{"class":89},"    State state ",[61,4364,128],{"class":67},[61,4366,4367],{"class":89}," Idle{};\n",[61,4369,4371,4374],{"class":63,"line":4370},44,[61,4372,4373],{"class":85},"    print_state",[61,4375,4376],{"class":89},"(state);\n",[61,4378,4380],{"class":63,"line":4379},45,[61,4381,119],{"emptyLinePlaceholder":118},[61,4383,4385,4388,4390,4393,4395],{"class":63,"line":4384},46,[61,4386,4387],{"class":89},"    state ",[61,4389,128],{"class":67},[61,4391,4392],{"class":89}," Running{",[61,4394,1995],{"class":131},[61,4396,1928],{"class":89},[61,4398,4400,4402],{"class":63,"line":4399},47,[61,4401,4373],{"class":85},[61,4403,4376],{"class":89},[61,4405,4407],{"class":63,"line":4406},48,[61,4408,119],{"emptyLinePlaceholder":118},[61,4410,4412,4414,4416,4419,4422],{"class":63,"line":4411},49,[61,4413,4387],{"class":89},[61,4415,128],{"class":67},[61,4417,4418],{"class":89}," Error{",[61,4420,4421],{"class":71},"\"motor timeout\"",[61,4423,1928],{"class":89},[61,4425,4427,4429],{"class":63,"line":4426},50,[61,4428,4373],{"class":85},[61,4430,4376],{"class":89},[61,4432,4434],{"class":63,"line":4433},51,[61,4435,119],{"emptyLinePlaceholder":118},[61,4437,4439,4441,4443],{"class":63,"line":4438},52,[61,4440,746],{"class":67},[61,4442,749],{"class":131},[61,4444,536],{"class":89},[61,4446,4448],{"class":63,"line":4447},53,[61,4449,757],{"class":89},[14,4451,4452,763],{},[28,4453,762],{},[52,4455,4458],{"className":4456,"code":4457,"language":769},[767],"state: idle\nstate: running task 42\nstate: error motor timeout\n",[18,4459,4457],{"__ignoreMap":57},[14,4461,4462,4463,4466,4467,4469],{},"這裡的狀態永遠只能是三種之一。相比用 ",[18,4464,4465],{},"int state_code"," 加一堆額外字段，",[18,4468,822],{}," 能把每種狀態需要的數據放在對應類型裡，減少“錯誤狀態卻還讀 running 字段”這類問題。",[10,4471,4472],{"id":4472},"常見錯誤",[14,4474,4475],{},[28,4476,4477],{},"錯誤 1：get 用錯類型拋異常",[52,4479,4481],{"className":54,"code":4480,"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,4482,4483,4505],{"__ignoreMap":57},[61,4484,4485,4487,4489,4491,4493,4496,4499,4501,4503],{"class":63,"line":64},[61,4486,86],{"class":85},[61,4488,90],{"class":89},[61,4490,93],{"class":67},[61,4492,96],{"class":89},[61,4494,4495],{"class":67},"double>",[61,4497,4498],{"class":89}," v ",[61,4500,128],{"class":67},[61,4502,132],{"class":131},[61,4504,536],{"class":89},[61,4506,4507,4509,4511,4513,4515,4517,4519,4521,4523,4526],{"class":63,"line":115},[61,4508,86],{"class":85},[61,4510,543],{"class":89},[61,4512,546],{"class":67},[61,4514,164],{"class":85},[61,4516,167],{"class":89},[61,4518,211],{"class":85},[61,4520,214],{"class":89},[61,4522,99],{"class":67},[61,4524,4525],{"class":89},">(v);",[61,4527,4528],{"class":138},"  \u002F\u002F ❌ 抛出 std::bad_variant_access！\n",[14,4530,4531,4532,4535,4536,31],{},"正確做法：先用 ",[18,4533,4534],{},"std::holds_alternative\u003Cdouble>(v)"," 檢查，或用 ",[18,4537,4538],{},"std::get_if",[14,4540,4541],{},[28,4542,4543],{},"錯誤 2：variant 中沒有默認類型時默認構造",[52,4545,4547],{"className":54,"code":4546,"language":56,"meta":57,"style":57},"std::variant\u003Cint, std::string> v;  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[18,4548,4549],{"__ignoreMap":57},[61,4550,4551,4553,4555,4557,4559,4561,4563,4565,4568],{"class":63,"line":64},[61,4552,86],{"class":85},[61,4554,90],{"class":89},[61,4556,93],{"class":67},[61,4558,96],{"class":89},[61,4560,86],{"class":85},[61,4562,106],{"class":89},[61,4564,109],{"class":67},[61,4566,4567],{"class":89}," v;",[61,4569,4570],{"class":138},"  \u002F\u002F 默认构造第一个类型的默认值（int = 0）\n",[14,4572,4573],{},"這種情況是合法的，但如果第一種類型沒有默認構造函數，則編譯失敗。",[14,4575,4576],{},[28,4577,4578],{},"錯誤 3：visit 的 visitor 沒有覆蓋所有類型",[52,4580,4582],{"className":54,"code":4581,"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,4583,4584,4593,4608,4613,4617,4639],{"__ignoreMap":57},[61,4585,4586,4588,4591],{"class":63,"line":64},[61,4587,1666],{"class":67},[61,4589,4590],{"class":85}," Visitor",[61,4592,1457],{"class":89},[61,4594,4595,4597,4599,4601,4603,4605],{"class":63,"line":115},[61,4596,1765],{"class":67},[61,4598,1768],{"class":67},[61,4600,1771],{"class":85},[61,4602,173],{"class":89},[61,4604,199],{"class":67},[61,4606,4607],{"class":89},") {}\n",[61,4609,4610],{"class":63,"line":122},[61,4611,4612],{"class":138},"    \u002F\u002F 缺少 double 和 string 的 operator()\n",[61,4614,4615],{"class":63,"line":142},[61,4616,1928],{"class":89},[61,4618,4619,4621,4623,4625,4627,4629,4631,4633,4635,4637],{"class":63,"line":157},[61,4620,86],{"class":85},[61,4622,90],{"class":89},[61,4624,93],{"class":67},[61,4626,96],{"class":89},[61,4628,99],{"class":67},[61,4630,96],{"class":89},[61,4632,86],{"class":85},[61,4634,106],{"class":89},[61,4636,109],{"class":67},[61,4638,112],{"class":89},[61,4640,4641,4643,4645,4647,4650],{"class":63,"line":185},[61,4642,86],{"class":85},[61,4644,167],{"class":89},[61,4646,288],{"class":85},[61,4648,4649],{"class":89},"(Visitor{}, v);",[61,4651,4652],{"class":138},"  \u002F\u002F ❌ 编译错误！\n",[14,4654,4655,4656,4658],{},"正確做法：visit 的 visitor 必須為 variant 中所有類型提供 ",[18,4657,2485],{},"，或者用泛型 lambda。",[10,4660,4661],{"id":4661},"使用建議",[4663,4664,4665,4673,4681,4689,4695,4701],"ol",{},[2118,4666,4667,4672],{},[28,4668,4669,4670],{},"替代 ",[18,4671,20],{},"：variant 類型安全，知道當前存的是什麼。",[2118,4674,4675,31],{},[28,4676,4677,4678,4680],{},"用 ",[18,4679,2066],{}," + 泛型 lambda 是最簡潔的訪問方式",[2118,4682,4683,4688],{},[28,4684,4685,4686],{},"需要\"知道當前是哪種類型\"時用 ",[18,4687,4538],{},"：返回指針，安全高效。",[2118,4690,4691,4694],{},[28,4692,4693],{},"用 variant + visit 實現消息\u002F事件分發","：模式匹配的雛形。",[2118,4696,4697,4700],{},[28,4698,4699],{},"variant 的大小是所有類型中最大的 + 索引字段","：不要存太多大類型。",[2118,4702,4703,4706],{},[28,4704,4705],{},"類型種類有限時用 variant 更清晰","：如果類型需要隨插件擴展，繼承和虛函數通常更合適。",[10,4708,4709],{"id":4709},"小結",[2115,4711,4712,4717,4725,4730],{},[2118,4713,4714,4716],{},[18,4715,39],{}," 是類型安全的聯合體。",[2118,4718,4719,4721,4722,4724],{},[18,4720,386],{}," 直接獲取（不安全），",[18,4723,400],{}," 返回指針（安全）。",[2118,4726,4727,4729],{},[18,4728,420],{}," 是最推薦的方式，強制覆蓋所有類型。",[2118,4731,4732],{},"適用於消息分發、可選配置、狀態機等場景。",[4734,4735,4736],"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":4738},[4739,4740,4741,4742,4743,4744,4745,4753,4754,4755,4758,4759,4760],{"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":4746},[4747,4748,4749,4750,4751],{"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":2063,"depth":122,"text":4752},"std::visit 與 Visitor 機制",{"id":762,"depth":115,"text":762},{"id":3785,"depth":115,"text":3785},{"id":3890,"depth":115,"text":3891,"children":4756},[4757],{"id":3956,"depth":122,"text":3957},{"id":4472,"depth":115,"text":4472},{"id":4661,"depth":115,"text":4661},{"id":4709,"depth":115,"text":4709},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","2000-1500","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-tw:2023-10-05-cplusplus-jiao-xue","\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant",false,null,"zh-TW","zh-tw",{},{"title":5,"description":57},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","7-hGLxrCEjqU5A_6jfEi6KKZ8FKKIIraIW0_UYWx-vM",[4780,4786,4791,4796,4801,4806,4811,4816,4821,4826,4831,4836,4841,4846,4851,4856,4861,4866,4871,4876,4881,4886,4891,4896,4901,4906,4911,4916,4921,4926,4931,4936,4941,4946,4951,4956,4961,4966,4971,4976,4980,4985,4989,4994,4999,5004,5009,5014,5019,5024,5029,5034,5039,5044,5045,5050,5055,5060,5065,5070,5075,5080,5085,5090,5095,5100,5105,5110,5115,5120,5125,5130,5135,5140,5145,5150,5155,5160,5165,5170,5175,5180,5185,5190],{"path":4781,"stem":4782,"title":4783,"date":4763,"chapterOrder":4784,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":4787,"stem":4788,"title":4789,"date":4763,"chapterOrder":4790,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":4792,"stem":4793,"title":4794,"date":4763,"chapterOrder":4795,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":4797,"stem":4798,"title":4799,"date":4763,"chapterOrder":4800,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":4802,"stem":4803,"title":4804,"date":4763,"chapterOrder":4805,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":4807,"stem":4808,"title":4809,"date":4763,"chapterOrder":4810,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":4812,"stem":4813,"title":4814,"date":4763,"chapterOrder":4815,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":4817,"stem":4818,"title":4819,"date":4763,"chapterOrder":4820,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":4822,"stem":4823,"title":4824,"date":4763,"chapterOrder":4825,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":4827,"stem":4828,"title":4829,"date":4763,"chapterOrder":4830,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":4832,"stem":4833,"title":4834,"date":4763,"chapterOrder":4835,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":4837,"stem":4838,"title":4839,"date":4763,"chapterOrder":4840,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":4842,"stem":4843,"title":4844,"date":4763,"chapterOrder":4845,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函數提高","1300",{"path":4847,"stem":4848,"title":4849,"date":4763,"chapterOrder":4850,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空間","1350",{"path":4852,"stem":4853,"title":4854,"date":4763,"chapterOrder":4855,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":4857,"stem":4858,"title":4859,"date":4763,"chapterOrder":4860,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":4862,"stem":4863,"title":4864,"date":4763,"chapterOrder":4865,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":4867,"stem":4868,"title":4869,"date":4763,"chapterOrder":4870,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":4872,"stem":4873,"title":4874,"date":4763,"chapterOrder":4875,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":4877,"stem":4878,"title":4879,"date":4763,"chapterOrder":4880,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":4882,"stem":4883,"title":4884,"date":4763,"chapterOrder":4885,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":4887,"stem":4888,"title":4889,"date":4763,"chapterOrder":4890,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函數指針","1450",{"path":4892,"stem":4893,"title":4894,"date":4763,"chapterOrder":4895,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":4897,"stem":4898,"title":4899,"date":4763,"chapterOrder":4900,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":4902,"stem":4903,"title":4904,"date":4763,"chapterOrder":4905,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":4907,"stem":4908,"title":4909,"date":4763,"chapterOrder":4910,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":4912,"stem":4913,"title":4914,"date":4763,"chapterOrder":4915,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4917,"stem":4918,"title":4919,"date":4763,"chapterOrder":4920,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":4922,"stem":4923,"title":4924,"date":4763,"chapterOrder":4925,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4927,"stem":4928,"title":4929,"date":4763,"chapterOrder":4930,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4932,"stem":4933,"title":4934,"date":4763,"chapterOrder":4935,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4937,"stem":4938,"title":4939,"date":4763,"chapterOrder":4940,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":4942,"stem":4943,"title":4944,"date":4763,"chapterOrder":4945,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4947,"stem":4948,"title":4949,"date":4763,"chapterOrder":4950,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4952,"stem":4953,"title":4954,"date":4763,"chapterOrder":4955,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4957,"stem":4958,"title":4959,"date":4763,"chapterOrder":4960,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":4962,"stem":4963,"title":4964,"date":4763,"chapterOrder":4965,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":4967,"stem":4968,"title":4969,"date":4763,"chapterOrder":4970,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":4972,"stem":4973,"title":4974,"date":4763,"chapterOrder":4975,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":4977,"stem":4978,"title":3217,"date":4763,"chapterOrder":4979,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":4981,"stem":4982,"title":4983,"date":4763,"chapterOrder":4984,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":4986,"stem":4987,"title":1710,"date":4763,"chapterOrder":4988,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":4990,"stem":4991,"title":4992,"date":4763,"chapterOrder":4993,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4995,"stem":4996,"title":4997,"date":4763,"chapterOrder":4998,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":5000,"stem":5001,"title":5002,"date":4763,"chapterOrder":5003,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":5005,"stem":5006,"title":5007,"date":4763,"chapterOrder":5008,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":5010,"stem":5011,"title":5012,"date":4763,"chapterOrder":5013,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":5015,"stem":5016,"title":5017,"date":4763,"chapterOrder":5018,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":5020,"stem":5021,"title":5022,"date":4763,"chapterOrder":5023,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":5025,"stem":5026,"title":5027,"date":4763,"chapterOrder":5028,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":5030,"stem":5031,"title":5032,"date":4763,"chapterOrder":5033,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":5035,"stem":5036,"title":5037,"date":4763,"chapterOrder":5038,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":5040,"stem":5041,"title":5042,"date":4763,"chapterOrder":5043,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4761,"stem":4777,"title":5,"date":4763,"chapterOrder":4762,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},{"path":5046,"stem":5047,"title":5048,"date":4763,"chapterOrder":5049,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":5051,"stem":5052,"title":5053,"date":4763,"chapterOrder":5054,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":5056,"stem":5057,"title":5058,"date":4763,"chapterOrder":5059,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":5061,"stem":5062,"title":5063,"date":4763,"chapterOrder":5064,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 與 join","2000-1900-0100",{"path":5066,"stem":5067,"title":5068,"date":4763,"chapterOrder":5069,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 lock_guard","2000-1900-0200",{"path":5071,"stem":5072,"title":5073,"date":4763,"chapterOrder":5074,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":5076,"stem":5077,"title":5078,"date":4763,"chapterOrder":5079,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":5081,"stem":5082,"title":5083,"date":4763,"chapterOrder":5084,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":5086,"stem":5087,"title":5088,"date":4763,"chapterOrder":5089,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":5091,"stem":5092,"title":5093,"date":4763,"chapterOrder":5094,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":5096,"stem":5097,"title":5098,"date":4763,"chapterOrder":5099,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":5101,"stem":5102,"title":5103,"date":4763,"chapterOrder":5104,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":5106,"stem":5107,"title":5108,"date":4763,"chapterOrder":5109,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":5111,"stem":5112,"title":5113,"date":4763,"chapterOrder":5114,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":5116,"stem":5117,"title":5118,"date":4763,"chapterOrder":5119,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":5121,"stem":5122,"title":5123,"date":4763,"chapterOrder":5124,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":5126,"stem":5127,"title":5128,"date":4763,"chapterOrder":5129,"chapterDepth":115,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":5131,"stem":5132,"title":5133,"date":4763,"chapterOrder":5134,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":5136,"stem":5137,"title":5138,"date":4763,"chapterOrder":5139,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":5141,"stem":5142,"title":5143,"date":4763,"chapterOrder":5144,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":5146,"stem":5147,"title":5148,"date":4763,"chapterOrder":5149,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":5151,"stem":5152,"title":5153,"date":4763,"chapterOrder":5154,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代數庫","2100-0500",{"path":5156,"stem":5157,"title":5158,"date":4763,"chapterOrder":5159,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":5161,"stem":5162,"title":5163,"date":4763,"chapterOrder":5164,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":5166,"stem":5167,"title":5168,"date":4763,"chapterOrder":5169,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":5171,"stem":5172,"title":5173,"date":4763,"chapterOrder":5174,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src與lib模塊CMake詳解","2200-0300",{"path":5176,"stem":5177,"title":5178,"date":4763,"chapterOrder":5179,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":5181,"stem":5182,"title":5183,"date":4763,"chapterOrder":5184,"chapterDepth":64,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":5186,"stem":5187,"title":5188,"date":4763,"chapterOrder":5189,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":4770},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":4766,"stem":5191,"title":5192,"date":4763,"chapterOrder":4771,"chapterDepth":4785,"docKey":4765,"docRoot":4766,"docTitle":4767,"isWikiDoc":118,"isWikiIndex":118},"_i18n\u002Fzh-tw\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":5194},[5195,5198,5201,5204,5205],{"path":5196,"localeSlug":5197,"i18nKey":4769},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","en-us",{"path":5199,"localeSlug":5200,"i18nKey":4769},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","zh-hant",{"path":5202,"localeSlug":5203,"i18nKey":4769},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","zh-hk",{"path":4761,"localeSlug":4773,"i18nKey":4769},{"path":5206,"localeSlug":5207,"i18nKey":4769},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","zh-cn",[5196,4776,5199,4776,5202,4776,4761,4776,5206,4776],1788531327157]