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