[{"data":1,"prerenderedAt":2904},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function":3,"wiki-doc-items-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function":2482,"language-switcher-data-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function":2888,"wiki-i18n-paths-/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function":2903},{"id":4,"title":5,"body":6,"canonicalPath":2464,"chapter":2465,"chapterSort":2466,"date":2467,"description":180,"docI18nKey":2468,"docKey":2469,"docRoot":2470,"docTitle":2471,"extension":2472,"i18nKey":2473,"isBlogPost":2474,"isWikiDoc":209,"isWikiIndex":2474,"layout":2475,"legacyPath":2476,"locale":2477,"localeSlug":2478,"meta":2479,"navigation":209,"path":2464,"seo":2480,"sourcePath":2476,"sourceStem":2473,"stem":2473,"wikiDepth":187,"__hash__":2481},"content/wiki/2023-10-05-Cplusplus教学/ch18-12-std-function.md","std::function",{"type":7,"value":8,"toc":2446},"minimark",[9,13,17,33,36,42,45,51,65,69,78,81,166,169,174,704,711,719,723,733,1146,1150,1156,1160,1166,1568,1572,1578,1601,1605,1615,1972,1976,1982,1986,1991,2188,2192,2198,2201,2290,2294,2300,2348,2351,2388,2391,2415,2418,2442],[10,11,12],"h2",{"id":12},"本节解决什么问题",[14,15,16],"p",{},"普通函数、函数指针、Lambda、函数对象都可以\"被调用\"，它们统称为可调用对象。但它们的具体类型并不一样：",[18,19,20,24,27,30],"ul",{},[21,22,23],"li",{},"普通函数有函数类型。",[21,25,26],{},"函数指针是指针类型。",[21,28,29],{},"每个 Lambda 都有编译器生成的独立类型。",[21,31,32],{},"函数对象是自定义类类型。",[14,34,35],{},"如果你只是立刻调用一次，类型不同通常不是问题；但如果你要把回调保存到成员变量里，或者把多个不同回调放进同一个容器里，就需要一个统一类型。",[14,37,38,41],{},[39,40,5],"code",{}," 就是标准库提供的通用可调用对象包装器。",[10,43,44],{"id":44},"这个特性是什么",[14,46,47,50],{},[39,48,49],{},"std::function\u003C返回值(参数列表)>"," 可以保存任何签名匹配的可调用对象。",[14,52,53,54,57,58,61,62,64],{},"例如 ",[39,55,56],{},"std::function\u003Cint(int, int)>"," 表示：保存一个可以用两个 ",[39,59,60],{},"int"," 调用，并返回 ",[39,63,60],{}," 的可调用对象。",[10,66,68],{"id":67},"c-标准版本","C++ 标准版本",[14,70,71,73,74,77],{},[39,72,5],{}," 从 C++11 开始提供，需要头文件 ",[39,75,76],{},"\u003Cfunctional>","。",[10,79,80],{"id":80},"常见场景",[82,83,84,103],"table",{},[85,86,87],"thead",{},[88,89,90,95,100],"tr",{},[91,92,94],"th",{"align":93},"left","场景",[91,96,97,98],{"align":93},"是否适合 ",[39,99,5],{},[91,101,102],{"align":93},"原因",[104,105,106,118,129,142,155],"tbody",{},[88,107,108,112,115],{},[109,110,111],"td",{"align":93},"函数里立刻调用一次回调",[109,113,114],{"align":93},"不一定",[109,116,117],{"align":93},"模板参数通常更轻量",[88,119,120,123,126],{},[109,121,122],{"align":93},"类成员变量保存一个回调",[109,124,125],{"align":93},"适合",[109,127,128],{"align":93},"成员变量需要稳定类型",[88,130,131,137,139],{},[109,132,133,136],{"align":93},[39,134,135],{},"vector"," 保存多个不同 lambda",[109,138,125],{"align":93},[109,140,141],{"align":93},"容器元素必须是同一种类型",[88,143,144,147,150],{},[109,145,146],{"align":93},"高频性能热点里的小函数",[109,148,149],{"align":93},"谨慎",[109,151,152,154],{"align":93},[39,153,5],{}," 有类型擦除开销",[88,156,157,160,163],{},[109,158,159],{"align":93},"只保存无捕获函数",[109,161,162],{"align":93},"函数指针也可以",[109,164,165],{"align":93},"但函数指针不能保存有捕获 lambda",[10,167,168],{"id":168},"示例代码",[170,171,173],"h3",{"id":172},"示例-1统一保存不同类型的可调用对象","示例 1：统一保存不同类型的可调用对象",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cfunctional>\n#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nstruct Multiply\n{\n    int operator()(int a, int b) const\n    {\n        return a * b;\n    }\n};\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    // std::function 可以保存普通函数、lambda 或函数对象。\n    std::function\u003Cint(int, int)> op;\n\n    op = add;\n    std::cout \u003C\u003C \"add: \" \u003C\u003C op(3, 4) \u003C\u003C \"\\n\";\n\n    int (*function_pointer)(int, int) = add;\n    op = function_pointer;\n    std::cout \u003C\u003C \"function pointer: \" \u003C\u003C op(5, 6) \u003C\u003C \"\\n\";\n\n    op = [](int a, int b) {\n        return a - b;\n    };\n    std::cout \u003C\u003C \"lambda: \" \u003C\u003C op(10, 3) \u003C\u003C \"\\n\";\n\n    op = Multiply{};\n    std::cout \u003C\u003C \"function object: \" \u003C\u003C op(7, 8) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n","cpp","",[39,182,183,196,204,211,241,247,262,268,273,282,287,317,323,336,342,348,353,364,369,376,382,411,416,428,475,480,500,510,548,553,576,588,594,631,636,646,684,689,699],{"__ignoreMap":180},[184,185,188,192],"span",{"class":186,"line":187},"line",1,[184,189,191],{"class":190},"szBVR","#include",[184,193,195],{"class":194},"sZZnC"," \u003Cfunctional>\n",[184,197,199,201],{"class":186,"line":198},2,[184,200,191],{"class":190},[184,202,203],{"class":194}," \u003Ciostream>\n",[184,205,207],{"class":186,"line":206},3,[184,208,210],{"emptyLinePlaceholder":209},true,"\n",[184,212,214,216,220,224,226,230,233,235,238],{"class":186,"line":213},4,[184,215,60],{"class":190},[184,217,219],{"class":218},"sScJk"," add",[184,221,223],{"class":222},"sVt8B","(",[184,225,60],{"class":190},[184,227,229],{"class":228},"s4XuR"," a",[184,231,232],{"class":222},", ",[184,234,60],{"class":190},[184,236,237],{"class":228}," b",[184,239,240],{"class":222},")\n",[184,242,244],{"class":186,"line":243},5,[184,245,246],{"class":222},"{\n",[184,248,250,253,256,259],{"class":186,"line":249},6,[184,251,252],{"class":190},"    return",[184,254,255],{"class":222}," a ",[184,257,258],{"class":190},"+",[184,260,261],{"class":222}," b;\n",[184,263,265],{"class":186,"line":264},7,[184,266,267],{"class":222},"}\n",[184,269,271],{"class":186,"line":270},8,[184,272,210],{"emptyLinePlaceholder":209},[184,274,276,279],{"class":186,"line":275},9,[184,277,278],{"class":190},"struct",[184,280,281],{"class":218}," Multiply\n",[184,283,285],{"class":186,"line":284},10,[184,286,246],{"class":222},[184,288,290,293,296,299,301,303,305,307,309,311,314],{"class":186,"line":289},11,[184,291,292],{"class":190},"    int",[184,294,295],{"class":190}," operator",[184,297,298],{"class":218},"()",[184,300,223],{"class":222},[184,302,60],{"class":190},[184,304,229],{"class":228},[184,306,232],{"class":222},[184,308,60],{"class":190},[184,310,237],{"class":228},[184,312,313],{"class":222},") ",[184,315,316],{"class":190},"const\n",[184,318,320],{"class":186,"line":319},12,[184,321,322],{"class":222},"    {\n",[184,324,326,329,331,334],{"class":186,"line":325},13,[184,327,328],{"class":190},"        return",[184,330,255],{"class":222},[184,332,333],{"class":190},"*",[184,335,261],{"class":222},[184,337,339],{"class":186,"line":338},14,[184,340,341],{"class":222},"    }\n",[184,343,345],{"class":186,"line":344},15,[184,346,347],{"class":222},"};\n",[184,349,351],{"class":186,"line":350},16,[184,352,210],{"emptyLinePlaceholder":209},[184,354,356,358,361],{"class":186,"line":355},17,[184,357,60],{"class":190},[184,359,360],{"class":218}," main",[184,362,363],{"class":222},"()\n",[184,365,367],{"class":186,"line":366},18,[184,368,246],{"class":222},[184,370,372],{"class":186,"line":371},19,[184,373,375],{"class":374},"sJ8bj","    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[184,377,379],{"class":186,"line":378},20,[184,380,381],{"class":374},"    // std::function 可以保存普通函数、lambda 或函数对象。\n",[184,383,385,388,391,394,396,398,400,402,405,408],{"class":186,"line":384},21,[184,386,387],{"class":218},"    std",[184,389,390],{"class":222},"::function",[184,392,393],{"class":190},"\u003Cint",[184,395,223],{"class":222},[184,397,60],{"class":190},[184,399,232],{"class":222},[184,401,60],{"class":190},[184,403,404],{"class":222},")",[184,406,407],{"class":190},">",[184,409,410],{"class":222}," op;\n",[184,412,414],{"class":186,"line":413},22,[184,415,210],{"emptyLinePlaceholder":209},[184,417,419,422,425],{"class":186,"line":418},23,[184,420,421],{"class":222},"    op ",[184,423,424],{"class":190},"=",[184,426,427],{"class":222}," add;\n",[184,429,431,433,436,439,442,445,448,450,454,456,459,461,463,466,469,472],{"class":186,"line":430},24,[184,432,387],{"class":218},[184,434,435],{"class":222},"::cout ",[184,437,438],{"class":190},"\u003C\u003C",[184,440,441],{"class":194}," \"add: \"",[184,443,444],{"class":190}," \u003C\u003C",[184,446,447],{"class":218}," op",[184,449,223],{"class":222},[184,451,453],{"class":452},"sj4cs","3",[184,455,232],{"class":222},[184,457,458],{"class":452},"4",[184,460,313],{"class":222},[184,462,438],{"class":190},[184,464,465],{"class":194}," \"",[184,467,468],{"class":452},"\\n",[184,470,471],{"class":194},"\"",[184,473,474],{"class":222},";\n",[184,476,478],{"class":186,"line":477},25,[184,479,210],{"emptyLinePlaceholder":209},[184,481,483,485,488,490,492,494,496,498],{"class":186,"line":482},26,[184,484,292],{"class":190},[184,486,487],{"class":222}," (*function_pointer)(",[184,489,60],{"class":190},[184,491,232],{"class":222},[184,493,60],{"class":190},[184,495,313],{"class":222},[184,497,424],{"class":190},[184,499,427],{"class":222},[184,501,503,505,507],{"class":186,"line":502},27,[184,504,421],{"class":222},[184,506,424],{"class":190},[184,508,509],{"class":222}," function_pointer;\n",[184,511,513,515,517,519,522,524,526,528,531,533,536,538,540,542,544,546],{"class":186,"line":512},28,[184,514,387],{"class":218},[184,516,435],{"class":222},[184,518,438],{"class":190},[184,520,521],{"class":194}," \"function pointer: \"",[184,523,444],{"class":190},[184,525,447],{"class":218},[184,527,223],{"class":222},[184,529,530],{"class":452},"5",[184,532,232],{"class":222},[184,534,535],{"class":452},"6",[184,537,313],{"class":222},[184,539,438],{"class":190},[184,541,465],{"class":194},[184,543,468],{"class":452},[184,545,471],{"class":194},[184,547,474],{"class":222},[184,549,551],{"class":186,"line":550},29,[184,552,210],{"emptyLinePlaceholder":209},[184,554,556,558,560,563,565,567,569,571,573],{"class":186,"line":555},30,[184,557,421],{"class":222},[184,559,424],{"class":190},[184,561,562],{"class":222}," [](",[184,564,60],{"class":190},[184,566,229],{"class":228},[184,568,232],{"class":222},[184,570,60],{"class":190},[184,572,237],{"class":228},[184,574,575],{"class":222},") {\n",[184,577,579,581,583,586],{"class":186,"line":578},31,[184,580,328],{"class":190},[184,582,255],{"class":222},[184,584,585],{"class":190},"-",[184,587,261],{"class":222},[184,589,591],{"class":186,"line":590},32,[184,592,593],{"class":222},"    };\n",[184,595,597,599,601,603,606,608,610,612,615,617,619,621,623,625,627,629],{"class":186,"line":596},33,[184,598,387],{"class":218},[184,600,435],{"class":222},[184,602,438],{"class":190},[184,604,605],{"class":194}," \"lambda: \"",[184,607,444],{"class":190},[184,609,447],{"class":218},[184,611,223],{"class":222},[184,613,614],{"class":452},"10",[184,616,232],{"class":222},[184,618,453],{"class":452},[184,620,313],{"class":222},[184,622,438],{"class":190},[184,624,465],{"class":194},[184,626,468],{"class":452},[184,628,471],{"class":194},[184,630,474],{"class":222},[184,632,634],{"class":186,"line":633},34,[184,635,210],{"emptyLinePlaceholder":209},[184,637,639,641,643],{"class":186,"line":638},35,[184,640,421],{"class":222},[184,642,424],{"class":190},[184,644,645],{"class":222}," Multiply{};\n",[184,647,649,651,653,655,658,660,662,664,667,669,672,674,676,678,680,682],{"class":186,"line":648},36,[184,650,387],{"class":218},[184,652,435],{"class":222},[184,654,438],{"class":190},[184,656,657],{"class":194}," \"function object: \"",[184,659,444],{"class":190},[184,661,447],{"class":218},[184,663,223],{"class":222},[184,665,666],{"class":452},"7",[184,668,232],{"class":222},[184,670,671],{"class":452},"8",[184,673,313],{"class":222},[184,675,438],{"class":190},[184,677,465],{"class":194},[184,679,468],{"class":452},[184,681,471],{"class":194},[184,683,474],{"class":222},[184,685,687],{"class":186,"line":686},37,[184,688,210],{"emptyLinePlaceholder":209},[184,690,692,694,697],{"class":186,"line":691},38,[184,693,252],{"class":190},[184,695,696],{"class":452}," 0",[184,698,474],{"class":222},[184,700,702],{"class":186,"line":701},39,[184,703,267],{"class":222},[14,705,706,710],{},[707,708,709],"strong",{},"运行结果","：",[175,712,717],{"className":713,"code":715,"language":716,"meta":180},[714],"language-text","add: 7\nfunction pointer: 11\nlambda: 7\nfunction object: 56\n","text",[39,718,715],{"__ignoreMap":180},[170,720,722],{"id":721},"示例-2把-stdfunction-作为参数传递回调","示例 2：把 std::function 作为参数传递回调",[14,724,725,726,729,730,77],{},"这个例子中，",[39,727,728],{},"calculate"," 不关心具体传进来的是普通函数还是 lambda，只要求签名是 ",[39,731,732],{},"int(int, int)",[175,734,736],{"className":177,"code":735,"language":179,"meta":180,"style":180},"#include \u003Cfunctional>\n#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\n// std::function 可以保存普通函数、lambda 或函数对象。\nint calculate(int a, int b, const std::function\u003Cint(int, int)>& op)\n{\n    return op(a, b);\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    int x = 10;\n    int y = 5;\n\n    int r1 = calculate(x, y, add);\n    std::cout \u003C\u003C \"add result = \" \u003C\u003C r1 \u003C\u003C \"\\n\";\n\n    int r2 = calculate(x, y, [](int a, int b) {\n        return a * b;\n    });\n    std::cout \u003C\u003C \"multiply result = \" \u003C\u003C r2 \u003C\u003C \"\\n\";\n\n    int offset = 100;\n    int r3 = calculate(x, y, [offset](int a, int b) {\n        return a + b + offset;\n    });\n    std::cout \u003C\u003C \"with offset result = \" \u003C\u003C r3 \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[39,737,738,744,750,754,774,778,788,792,796,801,857,861,870,874,878,886,890,894,908,922,926,940,965,969,995,1005,1010,1035,1039,1053,1085,1101,1105,1130,1134,1142],{"__ignoreMap":180},[184,739,740,742],{"class":186,"line":187},[184,741,191],{"class":190},[184,743,195],{"class":194},[184,745,746,748],{"class":186,"line":198},[184,747,191],{"class":190},[184,749,203],{"class":194},[184,751,752],{"class":186,"line":206},[184,753,210],{"emptyLinePlaceholder":209},[184,755,756,758,760,762,764,766,768,770,772],{"class":186,"line":213},[184,757,60],{"class":190},[184,759,219],{"class":218},[184,761,223],{"class":222},[184,763,60],{"class":190},[184,765,229],{"class":228},[184,767,232],{"class":222},[184,769,60],{"class":190},[184,771,237],{"class":228},[184,773,240],{"class":222},[184,775,776],{"class":186,"line":243},[184,777,246],{"class":222},[184,779,780,782,784,786],{"class":186,"line":249},[184,781,252],{"class":190},[184,783,255],{"class":222},[184,785,258],{"class":190},[184,787,261],{"class":222},[184,789,790],{"class":186,"line":264},[184,791,267],{"class":222},[184,793,794],{"class":186,"line":270},[184,795,210],{"emptyLinePlaceholder":209},[184,797,798],{"class":186,"line":275},[184,799,800],{"class":374},"// std::function 可以保存普通函数、lambda 或函数对象。\n",[184,802,803,805,808,810,812,814,816,818,820,822,825,828,831,834,837,839,841,843,845,847,850,853,855],{"class":186,"line":284},[184,804,60],{"class":190},[184,806,807],{"class":218}," calculate",[184,809,223],{"class":222},[184,811,60],{"class":190},[184,813,229],{"class":228},[184,815,232],{"class":222},[184,817,60],{"class":190},[184,819,237],{"class":228},[184,821,232],{"class":222},[184,823,824],{"class":190},"const",[184,826,827],{"class":218}," std",[184,829,830],{"class":222},"::",[184,832,833],{"class":218},"function",[184,835,836],{"class":222},"\u003C",[184,838,60],{"class":190},[184,840,223],{"class":222},[184,842,60],{"class":190},[184,844,232],{"class":222},[184,846,60],{"class":190},[184,848,849],{"class":222},")>",[184,851,852],{"class":190},"&",[184,854,447],{"class":228},[184,856,240],{"class":222},[184,858,859],{"class":186,"line":289},[184,860,246],{"class":222},[184,862,863,865,867],{"class":186,"line":319},[184,864,252],{"class":190},[184,866,447],{"class":218},[184,868,869],{"class":222},"(a, b);\n",[184,871,872],{"class":186,"line":325},[184,873,267],{"class":222},[184,875,876],{"class":186,"line":338},[184,877,210],{"emptyLinePlaceholder":209},[184,879,880,882,884],{"class":186,"line":344},[184,881,60],{"class":190},[184,883,360],{"class":218},[184,885,363],{"class":222},[184,887,888],{"class":186,"line":350},[184,889,246],{"class":222},[184,891,892],{"class":186,"line":355},[184,893,375],{"class":374},[184,895,896,898,901,903,906],{"class":186,"line":366},[184,897,292],{"class":190},[184,899,900],{"class":222}," x ",[184,902,424],{"class":190},[184,904,905],{"class":452}," 10",[184,907,474],{"class":222},[184,909,910,912,915,917,920],{"class":186,"line":371},[184,911,292],{"class":190},[184,913,914],{"class":222}," y ",[184,916,424],{"class":190},[184,918,919],{"class":452}," 5",[184,921,474],{"class":222},[184,923,924],{"class":186,"line":378},[184,925,210],{"emptyLinePlaceholder":209},[184,927,928,930,933,935,937],{"class":186,"line":384},[184,929,292],{"class":190},[184,931,932],{"class":222}," r1 ",[184,934,424],{"class":190},[184,936,807],{"class":218},[184,938,939],{"class":222},"(x, y, add);\n",[184,941,942,944,946,948,951,953,955,957,959,961,963],{"class":186,"line":413},[184,943,387],{"class":218},[184,945,435],{"class":222},[184,947,438],{"class":190},[184,949,950],{"class":194}," \"add result = \"",[184,952,444],{"class":190},[184,954,932],{"class":222},[184,956,438],{"class":190},[184,958,465],{"class":194},[184,960,468],{"class":452},[184,962,471],{"class":194},[184,964,474],{"class":222},[184,966,967],{"class":186,"line":418},[184,968,210],{"emptyLinePlaceholder":209},[184,970,971,973,976,978,980,983,985,987,989,991,993],{"class":186,"line":430},[184,972,292],{"class":190},[184,974,975],{"class":222}," r2 ",[184,977,424],{"class":190},[184,979,807],{"class":218},[184,981,982],{"class":222},"(x, y, [](",[184,984,60],{"class":190},[184,986,229],{"class":228},[184,988,232],{"class":222},[184,990,60],{"class":190},[184,992,237],{"class":228},[184,994,575],{"class":222},[184,996,997,999,1001,1003],{"class":186,"line":477},[184,998,328],{"class":190},[184,1000,255],{"class":222},[184,1002,333],{"class":190},[184,1004,261],{"class":222},[184,1006,1007],{"class":186,"line":482},[184,1008,1009],{"class":222},"    });\n",[184,1011,1012,1014,1016,1018,1021,1023,1025,1027,1029,1031,1033],{"class":186,"line":502},[184,1013,387],{"class":218},[184,1015,435],{"class":222},[184,1017,438],{"class":190},[184,1019,1020],{"class":194}," \"multiply result = \"",[184,1022,444],{"class":190},[184,1024,975],{"class":222},[184,1026,438],{"class":190},[184,1028,465],{"class":194},[184,1030,468],{"class":452},[184,1032,471],{"class":194},[184,1034,474],{"class":222},[184,1036,1037],{"class":186,"line":512},[184,1038,210],{"emptyLinePlaceholder":209},[184,1040,1041,1043,1046,1048,1051],{"class":186,"line":550},[184,1042,292],{"class":190},[184,1044,1045],{"class":222}," offset ",[184,1047,424],{"class":190},[184,1049,1050],{"class":452}," 100",[184,1052,474],{"class":222},[184,1054,1055,1057,1060,1062,1064,1067,1070,1073,1075,1077,1079,1081,1083],{"class":186,"line":555},[184,1056,292],{"class":190},[184,1058,1059],{"class":222}," r3 ",[184,1061,424],{"class":190},[184,1063,807],{"class":218},[184,1065,1066],{"class":222},"(x, y, [",[184,1068,1069],{"class":228},"offset",[184,1071,1072],{"class":222},"](",[184,1074,60],{"class":190},[184,1076,229],{"class":228},[184,1078,232],{"class":222},[184,1080,60],{"class":190},[184,1082,237],{"class":228},[184,1084,575],{"class":222},[184,1086,1087,1089,1091,1093,1096,1098],{"class":186,"line":578},[184,1088,328],{"class":190},[184,1090,255],{"class":222},[184,1092,258],{"class":190},[184,1094,1095],{"class":222}," b ",[184,1097,258],{"class":190},[184,1099,1100],{"class":222}," offset;\n",[184,1102,1103],{"class":186,"line":590},[184,1104,1009],{"class":222},[184,1106,1107,1109,1111,1113,1116,1118,1120,1122,1124,1126,1128],{"class":186,"line":596},[184,1108,387],{"class":218},[184,1110,435],{"class":222},[184,1112,438],{"class":190},[184,1114,1115],{"class":194}," \"with offset result = \"",[184,1117,444],{"class":190},[184,1119,1059],{"class":222},[184,1121,438],{"class":190},[184,1123,465],{"class":194},[184,1125,468],{"class":452},[184,1127,471],{"class":194},[184,1129,474],{"class":222},[184,1131,1132],{"class":186,"line":633},[184,1133,210],{"emptyLinePlaceholder":209},[184,1135,1136,1138,1140],{"class":186,"line":638},[184,1137,252],{"class":190},[184,1139,696],{"class":452},[184,1141,474],{"class":222},[184,1143,1144],{"class":186,"line":648},[184,1145,267],{"class":222},[14,1147,1148,710],{},[707,1149,709],{},[175,1151,1154],{"className":1152,"code":1153,"language":716,"meta":180},[714],"add result = 15\nmultiply result = 50\nwith offset result = 115\n",[39,1155,1153],{"__ignoreMap":180},[170,1157,1159],{"id":1158},"示例-3把回调保存到类成员变量","示例 3：把回调保存到类成员变量",[14,1161,1162,1163,1165],{},"函数指针不能保存有捕获的 lambda；",[39,1164,5],{}," 可以，所以它非常适合保存事件回调。",[175,1167,1169],{"className":177,"code":1168,"language":179,"meta":180,"style":180},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cutility>\n\nclass Button\n{\n    // std::function 可以保存普通函数、lambda 或函数对象。\n    std::function\u003Cvoid()> on_click_;\n\npublic:\n    void set_on_click(std::function\u003Cvoid()> callback)\n    {\n        on_click_ = std::move(callback);\n    }\n\n    void click() const\n    {\n        if (on_click_)\n        {\n            on_click_();\n        }\n        else\n        {\n            std::cout \u003C\u003C \"no callback\\n\";\n        }\n    }\n};\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    Button button;\n\n    button.click();\n\n    std::string name = \"Save\";\n    int count = 0;\n\n    button.set_on_click([name, &count]() {\n        ++count;\n        std::cout \u003C\u003C name \u003C\u003C \" clicked, count = \" \u003C\u003C count \u003C\u003C \"\\n\";\n    });\n\n    button.click();\n    button.click();\n\n    return 0;\n}\n",[39,1170,1171,1177,1183,1190,1197,1201,1209,1213,1217,1233,1237,1242,1272,1276,1293,1297,1301,1313,1317,1325,1330,1338,1343,1348,1352,1370,1374,1378,1382,1386,1394,1398,1402,1407,1411,1421,1425,1439,1452,1456,1480,1489,1521,1526,1531,1540,1549,1554,1563],{"__ignoreMap":180},[184,1172,1173,1175],{"class":186,"line":187},[184,1174,191],{"class":190},[184,1176,195],{"class":194},[184,1178,1179,1181],{"class":186,"line":198},[184,1180,191],{"class":190},[184,1182,203],{"class":194},[184,1184,1185,1187],{"class":186,"line":206},[184,1186,191],{"class":190},[184,1188,1189],{"class":194}," \u003Cstring>\n",[184,1191,1192,1194],{"class":186,"line":213},[184,1193,191],{"class":190},[184,1195,1196],{"class":194}," \u003Cutility>\n",[184,1198,1199],{"class":186,"line":243},[184,1200,210],{"emptyLinePlaceholder":209},[184,1202,1203,1206],{"class":186,"line":249},[184,1204,1205],{"class":190},"class",[184,1207,1208],{"class":218}," Button\n",[184,1210,1211],{"class":186,"line":264},[184,1212,246],{"class":222},[184,1214,1215],{"class":186,"line":270},[184,1216,381],{"class":374},[184,1218,1219,1221,1223,1226,1228,1230],{"class":186,"line":275},[184,1220,387],{"class":218},[184,1222,390],{"class":222},[184,1224,1225],{"class":190},"\u003Cvoid",[184,1227,298],{"class":222},[184,1229,407],{"class":190},[184,1231,1232],{"class":222}," on_click_;\n",[184,1234,1235],{"class":186,"line":284},[184,1236,210],{"emptyLinePlaceholder":209},[184,1238,1239],{"class":186,"line":289},[184,1240,1241],{"class":190},"public:\n",[184,1243,1244,1247,1250,1252,1255,1257,1259,1261,1264,1267,1270],{"class":186,"line":319},[184,1245,1246],{"class":190},"    void",[184,1248,1249],{"class":218}," set_on_click",[184,1251,223],{"class":222},[184,1253,1254],{"class":218},"std",[184,1256,830],{"class":222},[184,1258,833],{"class":218},[184,1260,836],{"class":222},[184,1262,1263],{"class":190},"void",[184,1265,1266],{"class":222},"()> ",[184,1268,1269],{"class":228},"callback",[184,1271,240],{"class":222},[184,1273,1274],{"class":186,"line":325},[184,1275,322],{"class":222},[184,1277,1278,1281,1283,1285,1287,1290],{"class":186,"line":338},[184,1279,1280],{"class":222},"        on_click_ ",[184,1282,424],{"class":190},[184,1284,827],{"class":218},[184,1286,830],{"class":222},[184,1288,1289],{"class":218},"move",[184,1291,1292],{"class":222},"(callback);\n",[184,1294,1295],{"class":186,"line":344},[184,1296,341],{"class":222},[184,1298,1299],{"class":186,"line":350},[184,1300,210],{"emptyLinePlaceholder":209},[184,1302,1303,1305,1308,1311],{"class":186,"line":355},[184,1304,1246],{"class":190},[184,1306,1307],{"class":218}," click",[184,1309,1310],{"class":222},"() ",[184,1312,316],{"class":190},[184,1314,1315],{"class":186,"line":366},[184,1316,322],{"class":222},[184,1318,1319,1322],{"class":186,"line":371},[184,1320,1321],{"class":190},"        if",[184,1323,1324],{"class":222}," (on_click_)\n",[184,1326,1327],{"class":186,"line":378},[184,1328,1329],{"class":222},"        {\n",[184,1331,1332,1335],{"class":186,"line":384},[184,1333,1334],{"class":218},"            on_click_",[184,1336,1337],{"class":222},"();\n",[184,1339,1340],{"class":186,"line":413},[184,1341,1342],{"class":222},"        }\n",[184,1344,1345],{"class":186,"line":418},[184,1346,1347],{"class":190},"        else\n",[184,1349,1350],{"class":186,"line":430},[184,1351,1329],{"class":222},[184,1353,1354,1357,1359,1361,1364,1366,1368],{"class":186,"line":477},[184,1355,1356],{"class":218},"            std",[184,1358,435],{"class":222},[184,1360,438],{"class":190},[184,1362,1363],{"class":194}," \"no callback",[184,1365,468],{"class":452},[184,1367,471],{"class":194},[184,1369,474],{"class":222},[184,1371,1372],{"class":186,"line":482},[184,1373,1342],{"class":222},[184,1375,1376],{"class":186,"line":502},[184,1377,341],{"class":222},[184,1379,1380],{"class":186,"line":512},[184,1381,347],{"class":222},[184,1383,1384],{"class":186,"line":550},[184,1385,210],{"emptyLinePlaceholder":209},[184,1387,1388,1390,1392],{"class":186,"line":555},[184,1389,60],{"class":190},[184,1391,360],{"class":218},[184,1393,363],{"class":222},[184,1395,1396],{"class":186,"line":578},[184,1397,246],{"class":222},[184,1399,1400],{"class":186,"line":590},[184,1401,375],{"class":374},[184,1403,1404],{"class":186,"line":596},[184,1405,1406],{"class":222},"    Button button;\n",[184,1408,1409],{"class":186,"line":633},[184,1410,210],{"emptyLinePlaceholder":209},[184,1412,1413,1416,1419],{"class":186,"line":638},[184,1414,1415],{"class":222},"    button.",[184,1417,1418],{"class":218},"click",[184,1420,1337],{"class":222},[184,1422,1423],{"class":186,"line":648},[184,1424,210],{"emptyLinePlaceholder":209},[184,1426,1427,1429,1432,1434,1437],{"class":186,"line":686},[184,1428,387],{"class":218},[184,1430,1431],{"class":222},"::string name ",[184,1433,424],{"class":190},[184,1435,1436],{"class":194}," \"Save\"",[184,1438,474],{"class":222},[184,1440,1441,1443,1446,1448,1450],{"class":186,"line":691},[184,1442,292],{"class":190},[184,1444,1445],{"class":222}," count ",[184,1447,424],{"class":190},[184,1449,696],{"class":452},[184,1451,474],{"class":222},[184,1453,1454],{"class":186,"line":701},[184,1455,210],{"emptyLinePlaceholder":209},[184,1457,1459,1461,1464,1467,1470,1472,1474,1477],{"class":186,"line":1458},40,[184,1460,1415],{"class":222},[184,1462,1463],{"class":218},"set_on_click",[184,1465,1466],{"class":222},"([",[184,1468,1469],{"class":228},"name",[184,1471,232],{"class":222},[184,1473,852],{"class":190},[184,1475,1476],{"class":228},"count",[184,1478,1479],{"class":222},"]() {\n",[184,1481,1483,1486],{"class":186,"line":1482},41,[184,1484,1485],{"class":190},"        ++",[184,1487,1488],{"class":222},"count;\n",[184,1490,1492,1495,1497,1499,1502,1504,1507,1509,1511,1513,1515,1517,1519],{"class":186,"line":1491},42,[184,1493,1494],{"class":218},"        std",[184,1496,435],{"class":222},[184,1498,438],{"class":190},[184,1500,1501],{"class":222}," name ",[184,1503,438],{"class":190},[184,1505,1506],{"class":194}," \" clicked, count = \"",[184,1508,444],{"class":190},[184,1510,1445],{"class":222},[184,1512,438],{"class":190},[184,1514,465],{"class":194},[184,1516,468],{"class":452},[184,1518,471],{"class":194},[184,1520,474],{"class":222},[184,1522,1524],{"class":186,"line":1523},43,[184,1525,1009],{"class":222},[184,1527,1529],{"class":186,"line":1528},44,[184,1530,210],{"emptyLinePlaceholder":209},[184,1532,1534,1536,1538],{"class":186,"line":1533},45,[184,1535,1415],{"class":222},[184,1537,1418],{"class":218},[184,1539,1337],{"class":222},[184,1541,1543,1545,1547],{"class":186,"line":1542},46,[184,1544,1415],{"class":222},[184,1546,1418],{"class":218},[184,1548,1337],{"class":222},[184,1550,1552],{"class":186,"line":1551},47,[184,1553,210],{"emptyLinePlaceholder":209},[184,1555,1557,1559,1561],{"class":186,"line":1556},48,[184,1558,252],{"class":190},[184,1560,696],{"class":452},[184,1562,474],{"class":222},[184,1564,1566],{"class":186,"line":1565},49,[184,1567,267],{"class":222},[14,1569,1570,710],{},[707,1571,709],{},[175,1573,1576],{"className":1574,"code":1575,"language":716,"meta":180},[714],"no callback\nSave clicked, count = 1\nSave clicked, count = 2\n",[39,1577,1575],{"__ignoreMap":180},[14,1579,1580,1581,1583,1584,1586,1587,1590,1591,1593,1594,1597,1598,1600],{},"这里按值捕获 ",[39,1582,1469],{},"，按引用捕获 ",[39,1585,1476],{},"。因为 ",[39,1588,1589],{},"button"," 和 ",[39,1592,1476],{}," 都在 ",[39,1595,1596],{},"main"," 中，",[39,1599,1476],{}," 活得比回调调用更久，所以这个例子是安全的。真实异步场景中，保存回调时要更谨慎地处理生命周期。",[170,1602,1604],{"id":1603},"示例-4把多个不同回调放进同一个容器","示例 4：把多个不同回调放进同一个容器",[14,1606,1607,1608,1610,1611,1614],{},"每个 Lambda 的类型都不同，不能直接放进同一个 ",[39,1609,135],{},"。用 ",[39,1612,1613],{},"std::function\u003Cvoid()>"," 之后，它们就有了统一类型。",[175,1616,1618],{"className":177,"code":1617,"language":179,"meta":180,"style":180},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cvector>\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    // std::function 可以保存普通函数、lambda 或函数对象。\n    // vector 是动态数组，元素数量可以在运行时变化。\n    std::vector\u003Cstd::function\u003Cvoid()>> tasks;\n\n    int total = 0;\n    std::string label = \"task\";\n\n    tasks.push_back([label]() {\n        std::cout \u003C\u003C label \u003C\u003C \" A\\n\";\n    });\n\n    tasks.push_back([&total]() {\n        total += 10;\n        std::cout \u003C\u003C \"add 10, total = \" \u003C\u003C total \u003C\u003C \"\\n\";\n    });\n\n    tasks.push_back([&total]() {\n        total *= 2;\n        std::cout \u003C\u003C \"double, total = \" \u003C\u003C total \u003C\u003C \"\\n\";\n    });\n\n    for (const auto& task : tasks)\n    {\n        task();\n    }\n\n    std::cout \u003C\u003C \"final total = \" \u003C\u003C total \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[39,1619,1620,1626,1632,1638,1645,1649,1657,1661,1665,1669,1674,1697,1701,1714,1728,1732,1747,1769,1773,1777,1792,1804,1829,1833,1837,1851,1863,1888,1892,1896,1912,1916,1923,1927,1931,1956,1960,1968],{"__ignoreMap":180},[184,1621,1622,1624],{"class":186,"line":187},[184,1623,191],{"class":190},[184,1625,195],{"class":194},[184,1627,1628,1630],{"class":186,"line":198},[184,1629,191],{"class":190},[184,1631,203],{"class":194},[184,1633,1634,1636],{"class":186,"line":206},[184,1635,191],{"class":190},[184,1637,1189],{"class":194},[184,1639,1640,1642],{"class":186,"line":213},[184,1641,191],{"class":190},[184,1643,1644],{"class":194}," \u003Cvector>\n",[184,1646,1647],{"class":186,"line":243},[184,1648,210],{"emptyLinePlaceholder":209},[184,1650,1651,1653,1655],{"class":186,"line":249},[184,1652,60],{"class":190},[184,1654,360],{"class":218},[184,1656,363],{"class":222},[184,1658,1659],{"class":186,"line":264},[184,1660,246],{"class":222},[184,1662,1663],{"class":186,"line":270},[184,1664,375],{"class":374},[184,1666,1667],{"class":186,"line":275},[184,1668,381],{"class":374},[184,1670,1671],{"class":186,"line":284},[184,1672,1673],{"class":374},"    // vector 是动态数组，元素数量可以在运行时变化。\n",[184,1675,1676,1678,1681,1683,1685,1687,1689,1691,1694],{"class":186,"line":289},[184,1677,387],{"class":218},[184,1679,1680],{"class":222},"::vector",[184,1682,836],{"class":190},[184,1684,1254],{"class":218},[184,1686,390],{"class":222},[184,1688,1225],{"class":190},[184,1690,298],{"class":222},[184,1692,1693],{"class":190},">>",[184,1695,1696],{"class":222}," tasks;\n",[184,1698,1699],{"class":186,"line":319},[184,1700,210],{"emptyLinePlaceholder":209},[184,1702,1703,1705,1708,1710,1712],{"class":186,"line":325},[184,1704,292],{"class":190},[184,1706,1707],{"class":222}," total ",[184,1709,424],{"class":190},[184,1711,696],{"class":452},[184,1713,474],{"class":222},[184,1715,1716,1718,1721,1723,1726],{"class":186,"line":338},[184,1717,387],{"class":218},[184,1719,1720],{"class":222},"::string label ",[184,1722,424],{"class":190},[184,1724,1725],{"class":194}," \"task\"",[184,1727,474],{"class":222},[184,1729,1730],{"class":186,"line":344},[184,1731,210],{"emptyLinePlaceholder":209},[184,1733,1734,1737,1740,1742,1745],{"class":186,"line":350},[184,1735,1736],{"class":222},"    tasks.",[184,1738,1739],{"class":218},"push_back",[184,1741,1466],{"class":222},[184,1743,1744],{"class":228},"label",[184,1746,1479],{"class":222},[184,1748,1749,1751,1753,1755,1758,1760,1763,1765,1767],{"class":186,"line":355},[184,1750,1494],{"class":218},[184,1752,435],{"class":222},[184,1754,438],{"class":190},[184,1756,1757],{"class":222}," label ",[184,1759,438],{"class":190},[184,1761,1762],{"class":194}," \" A",[184,1764,468],{"class":452},[184,1766,471],{"class":194},[184,1768,474],{"class":222},[184,1770,1771],{"class":186,"line":366},[184,1772,1009],{"class":222},[184,1774,1775],{"class":186,"line":371},[184,1776,210],{"emptyLinePlaceholder":209},[184,1778,1779,1781,1783,1785,1787,1790],{"class":186,"line":378},[184,1780,1736],{"class":222},[184,1782,1739],{"class":218},[184,1784,1466],{"class":222},[184,1786,852],{"class":190},[184,1788,1789],{"class":228},"total",[184,1791,1479],{"class":222},[184,1793,1794,1797,1800,1802],{"class":186,"line":384},[184,1795,1796],{"class":222},"        total ",[184,1798,1799],{"class":190},"+=",[184,1801,905],{"class":452},[184,1803,474],{"class":222},[184,1805,1806,1808,1810,1812,1815,1817,1819,1821,1823,1825,1827],{"class":186,"line":413},[184,1807,1494],{"class":218},[184,1809,435],{"class":222},[184,1811,438],{"class":190},[184,1813,1814],{"class":194}," \"add 10, total = \"",[184,1816,444],{"class":190},[184,1818,1707],{"class":222},[184,1820,438],{"class":190},[184,1822,465],{"class":194},[184,1824,468],{"class":452},[184,1826,471],{"class":194},[184,1828,474],{"class":222},[184,1830,1831],{"class":186,"line":418},[184,1832,1009],{"class":222},[184,1834,1835],{"class":186,"line":430},[184,1836,210],{"emptyLinePlaceholder":209},[184,1838,1839,1841,1843,1845,1847,1849],{"class":186,"line":477},[184,1840,1736],{"class":222},[184,1842,1739],{"class":218},[184,1844,1466],{"class":222},[184,1846,852],{"class":190},[184,1848,1789],{"class":228},[184,1850,1479],{"class":222},[184,1852,1853,1855,1858,1861],{"class":186,"line":482},[184,1854,1796],{"class":222},[184,1856,1857],{"class":190},"*=",[184,1859,1860],{"class":452}," 2",[184,1862,474],{"class":222},[184,1864,1865,1867,1869,1871,1874,1876,1878,1880,1882,1884,1886],{"class":186,"line":502},[184,1866,1494],{"class":218},[184,1868,435],{"class":222},[184,1870,438],{"class":190},[184,1872,1873],{"class":194}," \"double, total = \"",[184,1875,444],{"class":190},[184,1877,1707],{"class":222},[184,1879,438],{"class":190},[184,1881,465],{"class":194},[184,1883,468],{"class":452},[184,1885,471],{"class":194},[184,1887,474],{"class":222},[184,1889,1890],{"class":186,"line":512},[184,1891,1009],{"class":222},[184,1893,1894],{"class":186,"line":550},[184,1895,210],{"emptyLinePlaceholder":209},[184,1897,1898,1901,1904,1906,1909],{"class":186,"line":555},[184,1899,1900],{"class":190},"    for",[184,1902,1903],{"class":222}," (",[184,1905,824],{"class":190},[184,1907,1908],{"class":190}," auto&",[184,1910,1911],{"class":222}," task : tasks)\n",[184,1913,1914],{"class":186,"line":578},[184,1915,322],{"class":222},[184,1917,1918,1921],{"class":186,"line":590},[184,1919,1920],{"class":218},"        task",[184,1922,1337],{"class":222},[184,1924,1925],{"class":186,"line":596},[184,1926,341],{"class":222},[184,1928,1929],{"class":186,"line":633},[184,1930,210],{"emptyLinePlaceholder":209},[184,1932,1933,1935,1937,1939,1942,1944,1946,1948,1950,1952,1954],{"class":186,"line":638},[184,1934,387],{"class":218},[184,1936,435],{"class":222},[184,1938,438],{"class":190},[184,1940,1941],{"class":194}," \"final total = \"",[184,1943,444],{"class":190},[184,1945,1707],{"class":222},[184,1947,438],{"class":190},[184,1949,465],{"class":194},[184,1951,468],{"class":452},[184,1953,471],{"class":194},[184,1955,474],{"class":222},[184,1957,1958],{"class":186,"line":648},[184,1959,210],{"emptyLinePlaceholder":209},[184,1961,1962,1964,1966],{"class":186,"line":686},[184,1963,252],{"class":190},[184,1965,696],{"class":452},[184,1967,474],{"class":222},[184,1969,1970],{"class":186,"line":691},[184,1971,267],{"class":222},[14,1973,1974,710],{},[707,1975,709],{},[175,1977,1980],{"className":1978,"code":1979,"language":716,"meta":180},[714],"task A\nadd 10, total = 10\ndouble, total = 20\nfinal total = 20\n",[39,1981,1979],{"__ignoreMap":180},[170,1983,1985],{"id":1984},"示例-5只立刻调用时模板参数也可以接收回调","示例 5：只立刻调用时，模板参数也可以接收回调",[14,1987,1988,1990],{},[39,1989,5],{}," 的优势是\"保存和统一类型\"。如果只是立刻调用，不需要保存，函数模板通常更轻量。",[175,1992,1994],{"className":177,"code":1993,"language":179,"meta":180,"style":180},"#include \u003Ciostream>\n\ntemplate\u003Ctypename Callback>\nvoid repeat(int times, Callback callback)\n{\n    for (int i = 0; i \u003C times; ++i)\n    {\n        callback(i);\n    }\n}\n\nint main()\n{\n    // 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    repeat(3, [](int i) {\n        std::cout \u003C\u003C \"i = \" \u003C\u003C i \u003C\u003C \"\\n\";\n    });\n\n    // 返回 0 表示程序正常结束。\n    return 0;\n}\n",[39,1995,1996,2002,2006,2022,2046,2050,2079,2083,2091,2095,2099,2103,2111,2115,2119,2138,2163,2167,2171,2176,2184],{"__ignoreMap":180},[184,1997,1998,2000],{"class":186,"line":187},[184,1999,191],{"class":190},[184,2001,203],{"class":194},[184,2003,2004],{"class":186,"line":198},[184,2005,210],{"emptyLinePlaceholder":209},[184,2007,2008,2011,2013,2016,2019],{"class":186,"line":206},[184,2009,2010],{"class":190},"template",[184,2012,836],{"class":222},[184,2014,2015],{"class":190},"typename",[184,2017,2018],{"class":218}," Callback",[184,2020,2021],{"class":222},">\n",[184,2023,2024,2026,2029,2031,2033,2036,2038,2041,2044],{"class":186,"line":213},[184,2025,1263],{"class":190},[184,2027,2028],{"class":218}," repeat",[184,2030,223],{"class":222},[184,2032,60],{"class":190},[184,2034,2035],{"class":228}," times",[184,2037,232],{"class":222},[184,2039,2040],{"class":218},"Callback",[184,2042,2043],{"class":228}," callback",[184,2045,240],{"class":222},[184,2047,2048],{"class":186,"line":243},[184,2049,246],{"class":222},[184,2051,2052,2054,2056,2058,2061,2063,2065,2068,2070,2073,2076],{"class":186,"line":249},[184,2053,1900],{"class":190},[184,2055,1903],{"class":222},[184,2057,60],{"class":190},[184,2059,2060],{"class":222}," i ",[184,2062,424],{"class":190},[184,2064,696],{"class":452},[184,2066,2067],{"class":222},"; i ",[184,2069,836],{"class":190},[184,2071,2072],{"class":222}," times; ",[184,2074,2075],{"class":190},"++",[184,2077,2078],{"class":222},"i)\n",[184,2080,2081],{"class":186,"line":264},[184,2082,322],{"class":222},[184,2084,2085,2088],{"class":186,"line":270},[184,2086,2087],{"class":218},"        callback",[184,2089,2090],{"class":222},"(i);\n",[184,2092,2093],{"class":186,"line":275},[184,2094,341],{"class":222},[184,2096,2097],{"class":186,"line":284},[184,2098,267],{"class":222},[184,2100,2101],{"class":186,"line":289},[184,2102,210],{"emptyLinePlaceholder":209},[184,2104,2105,2107,2109],{"class":186,"line":319},[184,2106,60],{"class":190},[184,2108,360],{"class":218},[184,2110,363],{"class":222},[184,2112,2113],{"class":186,"line":325},[184,2114,246],{"class":222},[184,2116,2117],{"class":186,"line":338},[184,2118,375],{"class":374},[184,2120,2121,2124,2126,2128,2131,2133,2136],{"class":186,"line":344},[184,2122,2123],{"class":218},"    repeat",[184,2125,223],{"class":222},[184,2127,453],{"class":452},[184,2129,2130],{"class":222},", [](",[184,2132,60],{"class":190},[184,2134,2135],{"class":228}," i",[184,2137,575],{"class":222},[184,2139,2140,2142,2144,2146,2149,2151,2153,2155,2157,2159,2161],{"class":186,"line":350},[184,2141,1494],{"class":218},[184,2143,435],{"class":222},[184,2145,438],{"class":190},[184,2147,2148],{"class":194}," \"i = \"",[184,2150,444],{"class":190},[184,2152,2060],{"class":222},[184,2154,438],{"class":190},[184,2156,465],{"class":194},[184,2158,468],{"class":452},[184,2160,471],{"class":194},[184,2162,474],{"class":222},[184,2164,2165],{"class":186,"line":355},[184,2166,1009],{"class":222},[184,2168,2169],{"class":186,"line":366},[184,2170,210],{"emptyLinePlaceholder":209},[184,2172,2173],{"class":186,"line":371},[184,2174,2175],{"class":374},"    // 返回 0 表示程序正常结束。\n",[184,2177,2178,2180,2182],{"class":186,"line":378},[184,2179,252],{"class":190},[184,2181,696],{"class":452},[184,2183,474],{"class":222},[184,2185,2186],{"class":186,"line":384},[184,2187,267],{"class":222},[14,2189,2190,710],{},[707,2191,709],{},[175,2193,2196],{"className":2194,"code":2195,"language":716,"meta":180},[714],"i = 0\ni = 1\ni = 2\n",[39,2197,2195],{"__ignoreMap":180},[10,2199,2200],{"id":2200},"关键语法解释",[82,2202,2203,2216],{},[85,2204,2205],{},[88,2206,2207,2210,2213],{},[91,2208,2209],{"align":93},"写法",[91,2211,2212],{"align":93},"含义",[91,2214,2215],{"align":93},"注意事项",[104,2217,2218,2230,2248,2264,2277],{},[88,2219,2220,2224,2227],{},[109,2221,2222],{"align":93},[39,2223,1613],{},[109,2225,2226],{"align":93},"保存无参数、无返回值的回调",[109,2228,2229],{"align":93},"常用于按钮、定时器、任务队列",[88,2231,2232,2236,2245],{},[109,2233,2234],{"align":93},[39,2235,56],{},[109,2237,2238,2239,2241,2242,2244],{"align":93},"保存两个 ",[39,2240,60],{}," 参数、返回 ",[39,2243,60],{}," 的可调用对象",[109,2246,2247],{"align":93},"签名必须匹配",[88,2249,2250,2255,2261],{},[109,2251,2252],{"align":93},[39,2253,2254],{},"if (callback)",[109,2256,2257,2258,2260],{"align":93},"判断 ",[39,2259,5],{}," 是否为空",[109,2262,2263],{"align":93},"空回调不能直接调用",[88,2265,2266,2271,2274],{},[109,2267,2268],{"align":93},[39,2269,2270],{},"std::move(callback)",[109,2272,2273],{"align":93},"把传入的回调移动到成员变量",[109,2275,2276],{"align":93},"避免不必要拷贝",[88,2278,2279,2284,2287],{},[109,2280,2281],{"align":93},[39,2282,2283],{},"vector\u003Cstd::function\u003Cvoid()>>",[109,2285,2286],{"align":93},"保存多个不同类型的回调",[109,2288,2289],{"align":93},"容器元素类型统一",[10,2291,2293],{"id":2292},"stdfunction-和-lambda-的关系","std::function 和 Lambda 的关系",[14,2295,2296,2297,2299],{},"Lambda 是一种可调用对象，",[39,2298,5],{}," 是用来保存可调用对象的包装器。它们不是互相替代的关系。",[82,2301,2302,2312],{},[85,2303,2304],{},[88,2305,2306,2309],{},[91,2307,2308],{"align":93},"需求",[91,2310,2311],{"align":93},"推荐",[104,2313,2314,2322,2331,2340],{},[88,2315,2316,2319],{},[109,2317,2318],{"align":93},"就地写一段短逻辑",[109,2320,2321],{"align":93},"Lambda",[88,2323,2324,2327],{},[109,2325,2326],{"align":93},"把回调保存成变量或成员",[109,2328,2329],{"align":93},[39,2330,5],{},[88,2332,2333,2336],{},[109,2334,2335],{"align":93},"把多个不同 lambda 放入容器",[109,2337,2338],{"align":93},[39,2339,5],{},[88,2341,2342,2345],{},[109,2343,2344],{"align":93},"调用一次且性能敏感",[109,2346,2347],{"align":93},"函数模板",[10,2349,2350],{"id":2350},"常见错误",[2352,2353,2354,2362,2368,2371,2377],"ol",{},[21,2355,2356,2357,2359,2360,77],{},"空的 ",[39,2358,5],{}," 直接调用。调用前先判断 ",[39,2361,2254],{},[21,2363,2364,2365,2367],{},"签名不匹配。比如回调需要 ",[39,2366,732],{},"，就不能传入只接收一个参数的可调用对象。",[21,2369,2370],{},"保存回调时引用捕获了已经销毁的局部变量。",[21,2372,2373,2374,2376],{},"只需要临时调用一次，也把参数写成 ",[39,2375,5],{},"，在性能敏感代码中会产生不必要开销。",[21,2378,2379,2380,2383,2384,2387],{},"以为成员函数可以直接赋给 ",[39,2381,2382],{},"std::function\u003Cvoid(int)>","。非静态成员函数还需要对象，下一节会用 ",[39,2385,2386],{},"std::bind"," 和 Lambda 解决这个问题。",[10,2389,2390],{"id":2390},"使用建议",[2352,2392,2393,2398,2403,2406,2409],{},[21,2394,2395,2396,77],{},"需要保存回调时，用 ",[39,2397,5],{},[21,2399,2400,2401,77],{},"需要统一不同类型的回调时，用 ",[39,2402,5],{},[21,2404,2405],{},"只是立刻调用一次回调时，可以优先考虑模板参数。",[21,2407,2408],{},"保存回调时特别注意捕获对象的生命周期。",[21,2410,2411,2412,2414],{},"不要把 ",[39,2413,5],{}," 当成所有回调场景的唯一答案，它是清晰性和灵活性的工具，也有一定运行期开销。",[10,2416,2417],{"id":2417},"小结",[18,2419,2420,2423,2429,2434,2439],{},[21,2421,2422],{},"可调用对象包括普通函数、函数指针、Lambda、函数对象等。",[21,2424,2425,2428],{},[39,2426,2427],{},"std::function\u003C返回值(参数...)>"," 用统一类型保存签名匹配的可调用对象。",[21,2430,2431,2433],{},[39,2432,5],{}," 适合保存回调、作为成员变量、放入容器。",[21,2435,2356,2436,2438],{},[39,2437,5],{}," 不能调用。",[21,2440,2441],{},"只临时调用一次的回调，模板参数通常更轻量。",[2443,2444,2445],"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 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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}",{"title":180,"searchDepth":198,"depth":198,"links":2447},[2448,2449,2450,2451,2452,2459,2460,2461,2462,2463],{"id":12,"depth":198,"text":12},{"id":44,"depth":198,"text":44},{"id":67,"depth":198,"text":68},{"id":80,"depth":198,"text":80},{"id":168,"depth":198,"text":168,"children":2453},[2454,2455,2456,2457,2458],{"id":172,"depth":206,"text":173},{"id":721,"depth":206,"text":722},{"id":1158,"depth":206,"text":1159},{"id":1603,"depth":206,"text":1604},{"id":1984,"depth":206,"text":1985},{"id":2200,"depth":198,"text":2200},{"id":2292,"depth":198,"text":2293},{"id":2350,"depth":198,"text":2350},{"id":2390,"depth":198,"text":2390},{"id":2417,"depth":198,"text":2417},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","18.12",18120000,"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-12-std-function",false,null,"/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","zh-CN","zh-cn",{},{"title":5,"description":180},"LfKJ3_q758zXwbUzjnqL9P32gihV8pYLwKsFAW5rBaQ",[2483,2489,2494,2500,2506,2512,2518,2524,2530,2536,2542,2548,2554,2560,2566,2572,2578,2584,2590,2596,2602,2608,2614,2620,2626,2632,2638,2639,2644,2650,2656,2662,2668,2674,2680,2686,2692,2698,2704,2710,2716,2722,2728,2734,2740,2746,2752,2758,2764,2770,2776,2782,2788,2794,2800,2806,2812,2818,2824,2830,2836,2842,2848,2853,2858,2863,2868,2873,2878,2884],{"path":2484,"stem":2485,"title":2486,"date":2467,"chapter":2487,"chapterSort":2488,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2490,"stem":2491,"title":2492,"date":2467,"chapter":614,"chapterSort":2493,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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-内存分区与生命周期","内存分区与生命周期",10000000,{"path":2495,"stem":2496,"title":2497,"date":2467,"chapter":2498,"chapterSort":2499,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch11-yin-yong","wiki/2023-10-05-Cplusplus教学/ch11-引用","引用","11",11000000,{"path":2501,"stem":2502,"title":2503,"date":2467,"chapter":2504,"chapterSort":2505,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2507,"stem":2508,"title":2509,"date":2467,"chapter":2510,"chapterSort":2511,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-1-feng-zhuang","wiki/2023-10-05-Cplusplus教学/ch13-1-封装","封装","13.1",13010000,{"path":2513,"stem":2514,"title":2515,"date":2467,"chapter":2516,"chapterSort":2517,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2519,"stem":2520,"title":2521,"date":2467,"chapter":2522,"chapterSort":2523,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2525,"stem":2526,"title":2527,"date":2467,"chapter":2528,"chapterSort":2529,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2531,"stem":2532,"title":2533,"date":2467,"chapter":2534,"chapterSort":2535,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-5-ji-cheng","wiki/2023-10-05-Cplusplus教学/ch13-5-继承","继承","13.5",13050000,{"path":2537,"stem":2538,"title":2539,"date":2467,"chapter":2540,"chapterSort":2541,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-6-duo-tai","wiki/2023-10-05-Cplusplus教学/ch13-6-多态","多态","13.6",13060000,{"path":2543,"stem":2544,"title":2545,"date":2467,"chapter":2546,"chapterSort":2547,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch13-lei-he-dui-xiang","wiki/2023-10-05-Cplusplus教学/ch13-类和对象","类和对象","13",13000000,{"path":2549,"stem":2550,"title":2551,"date":2467,"chapter":2552,"chapterSort":2553,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch14-wen-jian-cao-zuo","wiki/2023-10-05-Cplusplus教学/ch14-文件操作","文件操作","14",14000000,{"path":2555,"stem":2556,"title":2557,"date":2467,"chapter":2558,"chapterSort":2559,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch15-mu-ban","wiki/2023-10-05-Cplusplus教学/ch15-模板","模板","15",15000000,{"path":2561,"stem":2562,"title":2563,"date":2467,"chapter":2564,"chapterSort":2565,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2567,"stem":2568,"title":2569,"date":2467,"chapter":2570,"chapterSort":2571,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2573,"stem":2574,"title":2575,"date":2467,"chapter":2576,"chapterSort":2577,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2579,"stem":2580,"title":2581,"date":2467,"chapter":2582,"chapterSort":2583,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2585,"stem":2586,"title":2587,"date":2467,"chapter":2588,"chapterSort":2589,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2591,"stem":2592,"title":2593,"date":2467,"chapter":2594,"chapterSort":2595,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2597,"stem":2598,"title":2599,"date":2467,"chapter":2600,"chapterSort":2601,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2603,"stem":2604,"title":2605,"date":2467,"chapter":2606,"chapterSort":2607,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2609,"stem":2610,"title":2611,"date":2467,"chapter":2612,"chapterSort":2613,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2615,"stem":2616,"title":2617,"date":2467,"chapter":2618,"chapterSort":2619,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2621,"stem":2622,"title":2623,"date":2467,"chapter":2624,"chapterSort":2625,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2627,"stem":2628,"title":2629,"date":2467,"chapter":2630,"chapterSort":2631,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2633,"stem":2634,"title":2635,"date":2467,"chapter":2636,"chapterSort":2637,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2464,"stem":2473,"title":5,"date":2467,"chapter":2465,"chapterSort":2466,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},{"path":2640,"stem":2641,"title":2386,"date":2467,"chapter":2642,"chapterSort":2643,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-13-std-bind","wiki/2023-10-05-Cplusplus教学/ch18-13-std-bind","18.13",18130000,{"path":2645,"stem":2646,"title":2647,"date":2467,"chapter":2648,"chapterSort":2649,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2651,"stem":2652,"title":2653,"date":2467,"chapter":2654,"chapterSort":2655,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-15-std-variant","wiki/2023-10-05-Cplusplus教学/ch18-15-std-variant","std::variant","18.15",18150000,{"path":2657,"stem":2658,"title":2659,"date":2467,"chapter":2660,"chapterSort":2661,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2663,"stem":2664,"title":2665,"date":2467,"chapter":2666,"chapterSort":2667,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2669,"stem":2670,"title":2671,"date":2467,"chapter":2672,"chapterSort":2673,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2675,"stem":2676,"title":2677,"date":2467,"chapter":2678,"chapterSort":2679,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2681,"stem":2682,"title":2683,"date":2467,"chapter":2684,"chapterSort":2685,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2687,"stem":2688,"title":2689,"date":2467,"chapter":2690,"chapterSort":2691,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2693,"stem":2694,"title":2695,"date":2467,"chapter":2696,"chapterSort":2697,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2699,"stem":2700,"title":2701,"date":2467,"chapter":2702,"chapterSort":2703,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2705,"stem":2706,"title":2707,"date":2467,"chapter":2708,"chapterSort":2709,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2711,"stem":2712,"title":2713,"date":2467,"chapter":2714,"chapterSort":2715,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2717,"stem":2718,"title":2719,"date":2467,"chapter":2720,"chapterSort":2721,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2723,"stem":2724,"title":2725,"date":2467,"chapter":2726,"chapterSort":2727,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-3-using","wiki/2023-10-05-Cplusplus教学/ch18-3-using","using","18.3",18030000,{"path":2729,"stem":2730,"title":2731,"date":2467,"chapter":2732,"chapterSort":2733,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2735,"stem":2736,"title":2737,"date":2467,"chapter":2738,"chapterSort":2739,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2741,"stem":2742,"title":2743,"date":2467,"chapter":2744,"chapterSort":2745,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2747,"stem":2748,"title":2749,"date":2467,"chapter":2750,"chapterSort":2751,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2753,"stem":2754,"title":2755,"date":2467,"chapter":2756,"chapterSort":2757,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2759,"stem":2760,"title":2761,"date":2467,"chapter":2762,"chapterSort":2763,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2765,"stem":2766,"title":2767,"date":2467,"chapter":2768,"chapterSort":2769,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch18-xian-dai-c","wiki/2023-10-05-Cplusplus教学/ch18-现代C++","现代C++","18",18000000,{"path":2771,"stem":2772,"title":2773,"date":2467,"chapter":2774,"chapterSort":2775,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2777,"stem":2778,"title":2779,"date":2467,"chapter":2780,"chapterSort":2781,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2783,"stem":2784,"title":2785,"date":2467,"chapter":2786,"chapterSort":2787,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2789,"stem":2790,"title":2791,"date":2467,"chapter":2792,"chapterSort":2793,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2795,"stem":2796,"title":2797,"date":2467,"chapter":2798,"chapterSort":2799,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2801,"stem":2802,"title":2803,"date":2467,"chapter":2804,"chapterSort":2805,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2807,"stem":2808,"title":2809,"date":2467,"chapter":2810,"chapterSort":2811,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2813,"stem":2814,"title":2815,"date":2467,"chapter":2816,"chapterSort":2817,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2819,"stem":2820,"title":2821,"date":2467,"chapter":2822,"chapterSort":2823,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2825,"stem":2826,"title":2827,"date":2467,"chapter":2828,"chapterSort":2829,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2831,"stem":2832,"title":2833,"date":2467,"chapter":2834,"chapterSort":2835,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2837,"stem":2838,"title":2839,"date":2467,"chapter":2840,"chapterSort":2841,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch19-chang-yong-ku","wiki/2023-10-05-Cplusplus教学/ch19-常用库","常用库学习","19",19000000,{"path":2843,"stem":2844,"title":2845,"date":2467,"chapter":2846,"chapterSort":2847,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2849,"stem":2850,"title":2851,"date":2467,"chapter":453,"chapterSort":2852,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch3-shu-ru-shu-chu","wiki/2023-10-05-Cplusplus教学/ch3-输入输出","输入输出",3000000,{"path":2854,"stem":2855,"title":2856,"date":2467,"chapter":458,"chapterSort":2857,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch4-yun-suan-fu","wiki/2023-10-05-Cplusplus教学/ch4-运算符","运算符",4000000,{"path":2859,"stem":2860,"title":2861,"date":2467,"chapter":530,"chapterSort":2862,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch5-cheng-xu-liu-cheng-jie-gou","wiki/2023-10-05-Cplusplus教学/ch5-程序流程结构","程序流程结构",5000000,{"path":2864,"stem":2865,"title":2866,"date":2467,"chapter":535,"chapterSort":2867,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch6-shu-zu","wiki/2023-10-05-Cplusplus教学/ch6-数组","数组",6000000,{"path":2869,"stem":2870,"title":2871,"date":2467,"chapter":666,"chapterSort":2872,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch7-han-shu-yu-tou-wen-jian","wiki/2023-10-05-Cplusplus教学/ch7-函数与头文件","函数与头文件",7000000,{"path":2874,"stem":2875,"title":2876,"date":2467,"chapter":671,"chapterSort":2877,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/zh-cn/wiki/2023-10-05-cplusplus-jiao-xue/ch8-zhi-zhen","wiki/2023-10-05-Cplusplus教学/ch8-指针","指针",8000000,{"path":2879,"stem":2880,"title":2881,"date":2467,"chapter":2882,"chapterSort":2883,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":2474},"/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":2470,"stem":2885,"title":2886,"date":2467,"chapter":2475,"chapterSort":2887,"docKey":2469,"docRoot":2470,"docTitle":2471,"isWikiDoc":209,"isWikiIndex":209},"wiki/2023-10-05-Cplusplus教学/index","C/C++教程",0,{"variants":2889},[2890,2893,2896,2899,2902],{"path":2891,"localeSlug":2892,"i18nKey":2473},"/en-us/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","en-us",{"path":2894,"localeSlug":2895,"i18nKey":2473},"/zh-hant/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","zh-hant",{"path":2897,"localeSlug":2898,"i18nKey":2473},"/zh-hk/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","zh-hk",{"path":2900,"localeSlug":2901,"i18nKey":2473},"/zh-tw/wiki/2023-10-05-cplusplus-jiao-xue/ch18-12-std-function","zh-tw",{"path":2464,"localeSlug":2478,"i18nKey":2473},[2891,2476,2894,2476,2897,2476,2900,2476,2464,2476],1780663036304]