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