[{"data":1,"prerenderedAt":4646},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu":4226,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu":4630,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu":4645},{"id":4,"title":5,"body":6,"canonicalPath":4208,"chapterDepth":93,"chapterOrder":4209,"date":4210,"description":75,"docI18nKey":4211,"docKey":4212,"docRoot":4213,"docTitle":4214,"extension":4215,"i18nKey":4216,"isBlogPost":4217,"isWikiDoc":104,"isWikiIndex":4217,"layout":4218,"legacyPath":4218,"locale":4219,"localeSlug":4220,"meta":4221,"navigation":104,"path":4208,"seo":4222,"sourcePath":4223,"sourceStem":4216,"stem":4224,"wikiDepth":82,"__hash__":4225},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础.md","Boost.Asio Basics",{"type":7,"value":8,"toc":4137},"minimark",[9,37,40,51,56,65,69,275,282,286,321,325,328,336,340,345,351,354,360,365,368,374,376,386,389,401,404,762,766,769,797,800,803,809,812,820,823,837,843,864,867,886,889,895,923,926,943,945,955,958,964,973,979,982,1505,1509,1512,1540,1543,1545,1551,1554,1560,1563,1569,1572,1581,1584,1590,1596,1616,1622,1632,1634,1640,1643,1653,1656,1974,1978,1981,2006,2010,2016,2019,2022,2073,2076,2082,2085,2105,2108,2132,2134,2140,2143,2146,2166,2169,2557,2561,2564,2588,2591,2597,2600,2603,2619,2622,2649,2652,2660,2663,2666,2672,2675,2678,2684,2686,2692,2695,2698,2718,2721,2724,2987,2991,2994,3022,3025,3031,3034,3040,3043,3049,3052,3116,3127,3130,3136,3138,3145,3148,3155,3182,3185,3989,3993,3996,4024,4027,4030,4036,4039,4045,4047,4053,4056,4059,4062,4076,4082,4085,4091,4093,4097,4133],[10,11,12],"blockquote",{},[13,14,15,16,20,21,20,24,20,27,20,30,20,33,36],"p",{},"This section doesn't rush into serial ports, TCP, and UDP, but instead clearly explains the basics of ",[17,18,19],"code",{},"io_context",", ",[17,22,23],{},"run()",[17,25,26],{},"post()",[17,28,29],{},"work_guard",[17,31,32],{},"buffer",[17,34,35],{},"std::bind",", and object lifecycle.\nIf you don't understand these things, later on, serial port and network programs will encounter issues like \"why the callback doesn't execute\", \"why the program exits directly\", \"why a segfault occurs\", etc.",[38,39],"hr",{},[41,42,44,45,47,48,50],"h2",{"id":43},"example-1-when-io_context-has-no-tasks-run-returns-immediately","Example 1: When ",[17,46,19],{}," has no tasks, ",[17,49,23],{}," returns immediately.",[52,53,55],"h3",{"id":54},"program-objective","program objective",[13,57,58,59,20,61,64],{},"Verify a very important phenomenon: if there are no uncompleted tasks in ",[17,60,19],{},[17,62,63],{},"io.run()"," will return immediately.",[52,66,68],{"id":67},"full-code","Full code",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-cpp shiki shiki-themes github-light github-dark","#include \u003Cboost\u002Fasio.hpp>\n#include \u003Ciostream>\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    std::cout \u003C\u003C \"main：准备调用 io.run()\" \u003C\u003C std::endl;\n\n    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n    std::size_t count = io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回，执行了 \" \u003C\u003C count \u003C\u003C \" 个回调\" \u003C\u003C std::endl;\n\n    return 0;\n}\n","cpp","",[17,77,78,91,99,106,120,126,133,139,154,159,183,188,194,219,224,251,256,269],{"__ignoreMap":75},[79,80,83,87],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"szBVR","#include",[79,88,90],{"class":89},"sZZnC"," \u003Cboost\u002Fasio.hpp>\n",[79,92,94,96],{"class":81,"line":93},2,[79,95,86],{"class":85},[79,97,98],{"class":89}," \u003Ciostream>\n",[79,100,102],{"class":81,"line":101},3,[79,103,105],{"emptyLinePlaceholder":104},true,"\n",[79,107,109,112,116],{"class":81,"line":108},4,[79,110,111],{"class":85},"int",[79,113,115],{"class":114},"sScJk"," main",[79,117,119],{"class":118},"sVt8B","()\n",[79,121,123],{"class":81,"line":122},5,[79,124,125],{"class":118},"{\n",[79,127,129],{"class":81,"line":128},6,[79,130,132],{"class":131},"sJ8bj","    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[79,134,136],{"class":81,"line":135},7,[79,137,138],{"class":131},"    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n",[79,140,142,145,148,151],{"class":81,"line":141},8,[79,143,144],{"class":114},"    boost",[79,146,147],{"class":118},"::",[79,149,150],{"class":114},"asio",[79,152,153],{"class":118},"::io_context io;\n",[79,155,157],{"class":81,"line":156},9,[79,158,105],{"emptyLinePlaceholder":104},[79,160,162,165,168,171,174,177,180],{"class":81,"line":161},10,[79,163,164],{"class":114},"    std",[79,166,167],{"class":118},"::cout ",[79,169,170],{"class":85},"\u003C\u003C",[79,172,173],{"class":89}," \"main：准备调用 io.run()\"",[79,175,176],{"class":85}," \u003C\u003C",[79,178,179],{"class":114}," std",[79,181,182],{"class":118},"::endl;\n",[79,184,186],{"class":81,"line":185},11,[79,187,105],{"emptyLinePlaceholder":104},[79,189,191],{"class":81,"line":190},12,[79,192,193],{"class":131},"    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n",[79,195,197,199,201,204,207,210,213,216],{"class":81,"line":196},13,[79,198,164],{"class":114},[79,200,147],{"class":118},[79,202,203],{"class":85},"size_t",[79,205,206],{"class":118}," count ",[79,208,209],{"class":85},"=",[79,211,212],{"class":118}," io.",[79,214,215],{"class":114},"run",[79,217,218],{"class":118},"();\n",[79,220,222],{"class":81,"line":221},14,[79,223,105],{"emptyLinePlaceholder":104},[79,225,227,229,231,233,236,238,240,242,245,247,249],{"class":81,"line":226},15,[79,228,164],{"class":114},[79,230,167],{"class":118},[79,232,170],{"class":85},[79,234,235],{"class":89}," \"main：io.run() 返回，执行了 \"",[79,237,176],{"class":85},[79,239,206],{"class":118},[79,241,170],{"class":85},[79,243,244],{"class":89}," \" 个回调\"",[79,246,176],{"class":85},[79,248,179],{"class":114},[79,250,182],{"class":118},[79,252,254],{"class":81,"line":253},16,[79,255,105],{"emptyLinePlaceholder":104},[79,257,259,262,266],{"class":81,"line":258},17,[79,260,261],{"class":85},"    return",[79,263,265],{"class":264},"sj4cs"," 0",[79,267,268],{"class":118},";\n",[79,270,272],{"class":81,"line":271},18,[79,273,274],{"class":118},"}\n",[13,276,277,281],{},[278,279,280],"strong",{},"Running Results",": See below for “Execution Output and Timeline”; specific times and sequences may vary slightly with the environment if the example involves timers, threads, networks, or external devices.",[52,283,285],{"id":284},"compile-and-run","Compile and run",[70,287,291],{"className":288,"code":289,"language":290,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","g++ demo1_empty_run.cpp -o demo1_empty_run -std=c++17 -lboost_system -pthread\n.\u002Fdemo1_empty_run\n","bash",[17,292,293,316],{"__ignoreMap":75},[79,294,295,298,301,304,307,310,313],{"class":81,"line":82},[79,296,297],{"class":114},"g++",[79,299,300],{"class":89}," demo1_empty_run.cpp",[79,302,303],{"class":264}," -o",[79,305,306],{"class":89}," demo1_empty_run",[79,308,309],{"class":264}," -std=c++17",[79,311,312],{"class":264}," -lboost_system",[79,314,315],{"class":264}," -pthread\n",[79,317,318],{"class":81,"line":93},[79,319,320],{"class":114},".\u002Fdemo1_empty_run\n",[52,322,324],{"id":323},"execution-output-and-chronological-order","Execution output and chronological order",[13,326,327],{},"This program does not wait and outputs immediately:",[70,329,334],{"className":330,"code":332,"language":333,"meta":75},[331],"language-text","main：准备调用 io.run()\nmain：io.run() 返回，执行了 0 个回调\n","text",[17,335,332],{"__ignoreMap":75},[52,337,339],{"id":338},"points-to-note-for-this-example","Points to note for this example",[13,341,342,344],{},[17,343,63],{}," is not always blocking. The condition for it to block is:",[70,346,349],{"className":347,"code":348,"language":333,"meta":75},[331],"io_context 里还有未完成的异步任务，或者还有 work_guard 保持它不退出。\n",[17,350,348],{"__ignoreMap":75},[13,352,353],{},"If there are no tasks, it will return immediately.",[52,355,357,359],{"id":356},"iorun-return-value",[17,358,63],{}," return value",[13,361,362,364],{},[17,363,63],{}," The return value indicates how many handlers were executed.",[13,366,367],{},"In this example, there is no task, so the return value is:",[70,369,372],{"className":370,"code":371,"language":333,"meta":75},[331],"0\n",[17,373,371],{"__ignoreMap":75},[38,375],{},[41,377,379,380,382,383],{"id":378},"example-2-submitting-tasks-using-post-in-a-normal-main","Example 2: Submitting tasks using ",[17,381,26],{}," in a normal ",[17,384,385],{},"main()",[52,387,55],{"id":388},"program-objective-1",[13,390,391,394,395,397,398,400],{},[17,392,393],{},"boost::asio::post()"," can submit a normal function to ",[17,396,19],{}," to be executed by ",[17,399,63],{}," later.",[52,402,68],{"id":403},"full-code-1",[70,405,407],{"className":72,"code":406,"language":74,"meta":75,"style":75},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nvoid print_msg(const std::string& msg)\n{\n    std::cout \u003C\u003C \"执行任务：\" \u003C\u003C msg \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    std::cout \u003C\u003C \"main：投递任务 A\" \u003C\u003C std::endl;\n    \u002F\u002F post 只是把任务放进队列，真正执行要等 io.run()。\n    boost::asio::post(io, std::bind(print_msg, std::string(\"A\")));\n\n    std::cout \u003C\u003C \"main：投递任务 B\" \u003C\u003C std::endl;\n    boost::asio::post(io, std::bind(print_msg, std::string(\"B\")));\n\n    std::cout \u003C\u003C \"main：准备调用 io.run()\" \u003C\u003C std::endl;\n\n    \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n    std::size_t count = io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回，执行了 \" \u003C\u003C count \u003C\u003C \" 个任务\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,408,409,415,422,428,435,439,470,474,496,500,504,512,516,520,524,534,538,555,560,602,607,625,661,666,683,688,693,712,717,743,748,757],{"__ignoreMap":75},[79,410,411,413],{"class":81,"line":82},[79,412,86],{"class":85},[79,414,90],{"class":89},[79,416,417,419],{"class":81,"line":93},[79,418,86],{"class":85},[79,420,421],{"class":89}," \u003Cfunctional>\n",[79,423,424,426],{"class":81,"line":101},[79,425,86],{"class":85},[79,427,98],{"class":89},[79,429,430,432],{"class":81,"line":108},[79,431,86],{"class":85},[79,433,434],{"class":89}," \u003Cstring>\n",[79,436,437],{"class":81,"line":122},[79,438,105],{"emptyLinePlaceholder":104},[79,440,441,444,447,450,453,455,457,460,463,467],{"class":81,"line":128},[79,442,443],{"class":85},"void",[79,445,446],{"class":114}," print_msg",[79,448,449],{"class":118},"(",[79,451,452],{"class":85},"const",[79,454,179],{"class":114},[79,456,147],{"class":118},[79,458,459],{"class":114},"string",[79,461,462],{"class":85},"&",[79,464,466],{"class":465},"s4XuR"," msg",[79,468,469],{"class":118},")\n",[79,471,472],{"class":81,"line":135},[79,473,125],{"class":118},[79,475,476,478,480,482,485,487,490,492,494],{"class":81,"line":141},[79,477,164],{"class":114},[79,479,167],{"class":118},[79,481,170],{"class":85},[79,483,484],{"class":89}," \"执行任务：\"",[79,486,176],{"class":85},[79,488,489],{"class":118}," msg ",[79,491,170],{"class":85},[79,493,179],{"class":114},[79,495,182],{"class":118},[79,497,498],{"class":81,"line":156},[79,499,274],{"class":118},[79,501,502],{"class":81,"line":161},[79,503,105],{"emptyLinePlaceholder":104},[79,505,506,508,510],{"class":81,"line":185},[79,507,111],{"class":85},[79,509,115],{"class":114},[79,511,119],{"class":118},[79,513,514],{"class":81,"line":190},[79,515,125],{"class":118},[79,517,518],{"class":81,"line":196},[79,519,132],{"class":131},[79,521,522],{"class":81,"line":221},[79,523,138],{"class":131},[79,525,526,528,530,532],{"class":81,"line":226},[79,527,144],{"class":114},[79,529,147],{"class":118},[79,531,150],{"class":114},[79,533,153],{"class":118},[79,535,536],{"class":81,"line":253},[79,537,105],{"emptyLinePlaceholder":104},[79,539,540,542,544,546,549,551,553],{"class":81,"line":258},[79,541,164],{"class":114},[79,543,167],{"class":118},[79,545,170],{"class":85},[79,547,548],{"class":89}," \"main：投递任务 A\"",[79,550,176],{"class":85},[79,552,179],{"class":114},[79,554,182],{"class":118},[79,556,557],{"class":81,"line":271},[79,558,559],{"class":131},"    \u002F\u002F post 只是把任务放进队列，真正执行要等 io.run()。\n",[79,561,563,565,567,569,571,574,577,580,582,585,588,590,592,594,596,599],{"class":81,"line":562},19,[79,564,144],{"class":114},[79,566,147],{"class":118},[79,568,150],{"class":114},[79,570,147],{"class":118},[79,572,573],{"class":114},"post",[79,575,576],{"class":118},"(io, ",[79,578,579],{"class":114},"std",[79,581,147],{"class":118},[79,583,584],{"class":114},"bind",[79,586,587],{"class":118},"(print_msg, ",[79,589,579],{"class":114},[79,591,147],{"class":118},[79,593,459],{"class":114},[79,595,449],{"class":118},[79,597,598],{"class":89},"\"A\"",[79,600,601],{"class":118},")));\n",[79,603,605],{"class":81,"line":604},20,[79,606,105],{"emptyLinePlaceholder":104},[79,608,610,612,614,616,619,621,623],{"class":81,"line":609},21,[79,611,164],{"class":114},[79,613,167],{"class":118},[79,615,170],{"class":85},[79,617,618],{"class":89}," \"main：投递任务 B\"",[79,620,176],{"class":85},[79,622,179],{"class":114},[79,624,182],{"class":118},[79,626,628,630,632,634,636,638,640,642,644,646,648,650,652,654,656,659],{"class":81,"line":627},22,[79,629,144],{"class":114},[79,631,147],{"class":118},[79,633,150],{"class":114},[79,635,147],{"class":118},[79,637,573],{"class":114},[79,639,576],{"class":118},[79,641,579],{"class":114},[79,643,147],{"class":118},[79,645,584],{"class":114},[79,647,587],{"class":118},[79,649,579],{"class":114},[79,651,147],{"class":118},[79,653,459],{"class":114},[79,655,449],{"class":118},[79,657,658],{"class":89},"\"B\"",[79,660,601],{"class":118},[79,662,664],{"class":81,"line":663},23,[79,665,105],{"emptyLinePlaceholder":104},[79,667,669,671,673,675,677,679,681],{"class":81,"line":668},24,[79,670,164],{"class":114},[79,672,167],{"class":118},[79,674,170],{"class":85},[79,676,173],{"class":89},[79,678,176],{"class":85},[79,680,179],{"class":114},[79,682,182],{"class":118},[79,684,686],{"class":81,"line":685},25,[79,687,105],{"emptyLinePlaceholder":104},[79,689,691],{"class":81,"line":690},26,[79,692,193],{"class":131},[79,694,696,698,700,702,704,706,708,710],{"class":81,"line":695},27,[79,697,164],{"class":114},[79,699,147],{"class":118},[79,701,203],{"class":85},[79,703,206],{"class":118},[79,705,209],{"class":85},[79,707,212],{"class":118},[79,709,215],{"class":114},[79,711,218],{"class":118},[79,713,715],{"class":81,"line":714},28,[79,716,105],{"emptyLinePlaceholder":104},[79,718,720,722,724,726,728,730,732,734,737,739,741],{"class":81,"line":719},29,[79,721,164],{"class":114},[79,723,167],{"class":118},[79,725,170],{"class":85},[79,727,235],{"class":89},[79,729,176],{"class":85},[79,731,206],{"class":118},[79,733,170],{"class":85},[79,735,736],{"class":89}," \" 个任务\"",[79,738,176],{"class":85},[79,740,179],{"class":114},[79,742,182],{"class":118},[79,744,746],{"class":81,"line":745},30,[79,747,105],{"emptyLinePlaceholder":104},[79,749,751,753,755],{"class":81,"line":750},31,[79,752,261],{"class":85},[79,754,265],{"class":264},[79,756,268],{"class":118},[79,758,760],{"class":81,"line":759},32,[79,761,274],{"class":118},[13,763,764,281],{},[278,765,280],{},[52,767,285],{"id":768},"compile-and-run-1",[70,770,772],{"className":288,"code":771,"language":290,"meta":75,"style":75},"g++ demo2_post.cpp -o demo2_post -std=c++17 -lboost_system -pthread\n.\u002Fdemo2_post\n",[17,773,774,792],{"__ignoreMap":75},[79,775,776,778,781,783,786,788,790],{"class":81,"line":82},[79,777,297],{"class":114},[79,779,780],{"class":89}," demo2_post.cpp",[79,782,303],{"class":264},[79,784,785],{"class":89}," demo2_post",[79,787,309],{"class":264},[79,789,312],{"class":264},[79,791,315],{"class":264},[79,793,794],{"class":81,"line":93},[79,795,796],{"class":114},".\u002Fdemo2_post\n",[52,798,324],{"id":799},"execution-output-and-chronological-order-1",[13,801,802],{},"The program immediately outputs:",[70,804,807],{"className":805,"code":806,"language":333,"meta":75},[331],"main：投递任务 A\nmain：投递任务 B\nmain：准备调用 io.run()\n执行任务：A\n执行任务：B\nmain：io.run() 返回，执行了 2 个任务\n",[17,808,806],{"__ignoreMap":75},[52,810,339],{"id":811},"points-to-note-for-this-example-1",[13,813,814,816,817,819],{},[17,815,26],{}," is not an immediately executed function, but rather puts the function into the task queue of ",[17,818,19],{},".",[13,821,822],{},"The actual execution occurs:",[70,824,826],{"className":72,"code":825,"language":74,"meta":75,"style":75},"io.run();\n",[17,827,828],{"__ignoreMap":75},[79,829,830,833,835],{"class":81,"line":82},[79,831,832],{"class":118},"io.",[79,834,215],{"class":114},[79,836,218],{"class":118},[52,838,840,842],{"id":839},"post-function-description",[17,841,26],{}," Function Description",[70,844,846],{"className":72,"code":845,"language":74,"meta":75,"style":75},"boost::asio::post(io, handler);\n",[17,847,848],{"__ignoreMap":75},[79,849,850,853,855,857,859,861],{"class":81,"line":82},[79,851,852],{"class":114},"boost",[79,854,147],{"class":118},[79,856,150],{"class":114},[79,858,147],{"class":118},[79,860,573],{"class":114},[79,862,863],{"class":118},"(io, handler);\n",[13,865,866],{},"Parameter:",[868,869,870,880],"ol",{},[871,872,873,876,877,879],"li",{},[17,874,875],{},"io",": which task is delivered to ",[17,878,19],{},";",[871,881,882,885],{},[17,883,884],{},"handler",": function object to be executed in the future.",[13,887,888],{},"Return value: Usually not a concern.",[52,890,892,894],{"id":891},"stdbind-description",[17,893,35],{}," Description",[70,896,898],{"className":72,"code":897,"language":74,"meta":75,"style":75},"std::bind(print_msg, std::string(\"A\"))\n",[17,899,900],{"__ignoreMap":75},[79,901,902,904,906,908,910,912,914,916,918,920],{"class":81,"line":82},[79,903,579],{"class":114},[79,905,147],{"class":118},[79,907,584],{"class":114},[79,909,587],{"class":118},[79,911,579],{"class":114},[79,913,147],{"class":118},[79,915,459],{"class":114},[79,917,449],{"class":118},[79,919,598],{"class":89},[79,921,922],{"class":118},"))\n",[13,924,925],{},"Indicates generating a \"parameterless function object\". When it is executed later, it is equivalent to executing:",[70,927,929],{"className":72,"code":928,"language":74,"meta":75,"style":75},"print_msg(\"A\");\n",[17,930,931],{"__ignoreMap":75},[79,932,933,936,938,940],{"class":81,"line":82},[79,934,935],{"class":114},"print_msg",[79,937,449],{"class":118},[79,939,598],{"class":89},[79,941,942],{"class":118},");\n",[38,944],{},[41,946,948,949,951,952,954],{"id":947},"example-3-work_guard-prevents-iorun-from-immediately-exiting-due-to-lack-of-tasks","Example 3: ",[17,950,29],{}," prevents ",[17,953,63],{}," from immediately exiting due to lack of tasks.",[52,956,55],{"id":957},"program-objective-2",[13,959,960,961,963],{},"In many robot programs, the Asio communication thread needs to run for a long time.\nIf there are no tasks for the time being, ",[17,962,63],{}," may return directly, and the communication thread ends.",[13,965,966,969,970,972],{},[17,967,968],{},"executor_work_guard"," can tell ",[17,971,19],{},":",[70,974,977],{"className":975,"code":976,"language":333,"meta":75},[331],"先别退出，我后面可能还会投递任务。\n",[17,978,976],{"__ignoreMap":75},[52,980,68],{"id":981},"full-code-2",[70,983,985],{"className":72,"code":984,"language":74,"meta":75,"style":75},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n#include \u003Cchrono>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cmemory>\n\nusing WorkGuard = boost::asio::executor_work_guard\u003Cboost::asio::io_context::executor_type>;\n\nvoid release_guard(const boost::system::error_code& ec,\n                   std::shared_ptr\u003CWorkGuard> guard)\n{\n    if (ec)\n    {\n        std::cout \u003C\u003C \"release_guard 定时器取消：\" \u003C\u003C ec.message() \u003C\u003C std::endl;\n        return;\n    }\n\n    std::cout \u003C\u003C \"2 秒到了：释放 work_guard\" \u003C\u003C std::endl;\n    guard->reset();\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io;\n\n    std::shared_ptr\u003CWorkGuard> guard =\n        std::make_shared\u003CWorkGuard>(boost::asio::make_work_guard(io));\n\n    \u002F\u002F 创建定时器，并设置到期时间。\n    boost::asio::steady_timer timer(io, std::chrono::seconds(2));\n\n    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n    timer.async_wait(std::bind(release_guard,\n                               std::placeholders::_1,\n                               guard));\n\n    std::cout \u003C\u003C \"main：有 work_guard，io.run() 不会空转退出\" \u003C\u003C std::endl;\n\n    std::size_t count = io.run();\n\n    std::cout \u003C\u003C \"main：io.run() 返回，执行了 \" \u003C\u003C count \u003C\u003C \" 个回调\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,986,987,993,1000,1007,1013,1019,1026,1030,1073,1077,1108,1131,1135,1143,1148,1177,1184,1189,1193,1210,1220,1224,1228,1236,1240,1244,1248,1258,1262,1282,1312,1316,1321,1358,1363,1369,1389,1403,1409,1414,1432,1437,1456,1461,1486,1491,1500],{"__ignoreMap":75},[79,988,989,991],{"class":81,"line":82},[79,990,86],{"class":85},[79,992,90],{"class":89},[79,994,995,997],{"class":81,"line":93},[79,996,86],{"class":85},[79,998,999],{"class":89}," \u003Cboost\u002Fsystem\u002Ferror_code.hpp>\n",[79,1001,1002,1004],{"class":81,"line":101},[79,1003,86],{"class":85},[79,1005,1006],{"class":89}," \u003Cchrono>\n",[79,1008,1009,1011],{"class":81,"line":108},[79,1010,86],{"class":85},[79,1012,421],{"class":89},[79,1014,1015,1017],{"class":81,"line":122},[79,1016,86],{"class":85},[79,1018,98],{"class":89},[79,1020,1021,1023],{"class":81,"line":128},[79,1022,86],{"class":85},[79,1024,1025],{"class":89}," \u003Cmemory>\n",[79,1027,1028],{"class":81,"line":135},[79,1029,105],{"emptyLinePlaceholder":104},[79,1031,1032,1035,1038,1041,1044,1046,1048,1050,1052,1055,1057,1059,1061,1063,1065,1067,1070],{"class":81,"line":141},[79,1033,1034],{"class":85},"using",[79,1036,1037],{"class":114}," WorkGuard",[79,1039,1040],{"class":85}," =",[79,1042,1043],{"class":114}," boost",[79,1045,147],{"class":118},[79,1047,150],{"class":114},[79,1049,147],{"class":118},[79,1051,968],{"class":114},[79,1053,1054],{"class":118},"\u003C",[79,1056,852],{"class":114},[79,1058,147],{"class":118},[79,1060,150],{"class":114},[79,1062,147],{"class":118},[79,1064,19],{"class":114},[79,1066,147],{"class":118},[79,1068,1069],{"class":114},"executor_type",[79,1071,1072],{"class":118},">;\n",[79,1074,1075],{"class":81,"line":156},[79,1076,105],{"emptyLinePlaceholder":104},[79,1078,1079,1081,1084,1086,1088,1090,1092,1095,1097,1100,1102,1105],{"class":81,"line":161},[79,1080,443],{"class":85},[79,1082,1083],{"class":114}," release_guard",[79,1085,449],{"class":118},[79,1087,452],{"class":85},[79,1089,1043],{"class":114},[79,1091,147],{"class":118},[79,1093,1094],{"class":114},"system",[79,1096,147],{"class":118},[79,1098,1099],{"class":114},"error_code",[79,1101,462],{"class":85},[79,1103,1104],{"class":465}," ec",[79,1106,1107],{"class":118},",\n",[79,1109,1110,1113,1115,1118,1120,1123,1126,1129],{"class":81,"line":185},[79,1111,1112],{"class":114},"                   std",[79,1114,147],{"class":118},[79,1116,1117],{"class":114},"shared_ptr",[79,1119,1054],{"class":118},[79,1121,1122],{"class":114},"WorkGuard",[79,1124,1125],{"class":118},"> ",[79,1127,1128],{"class":465},"guard",[79,1130,469],{"class":118},[79,1132,1133],{"class":81,"line":190},[79,1134,125],{"class":118},[79,1136,1137,1140],{"class":81,"line":196},[79,1138,1139],{"class":85},"    if",[79,1141,1142],{"class":118}," (ec)\n",[79,1144,1145],{"class":81,"line":221},[79,1146,1147],{"class":118},"    {\n",[79,1149,1150,1153,1155,1157,1160,1162,1165,1168,1171,1173,1175],{"class":81,"line":226},[79,1151,1152],{"class":114},"        std",[79,1154,167],{"class":118},[79,1156,170],{"class":85},[79,1158,1159],{"class":89}," \"release_guard 定时器取消：\"",[79,1161,176],{"class":85},[79,1163,1164],{"class":118}," ec.",[79,1166,1167],{"class":114},"message",[79,1169,1170],{"class":118},"() ",[79,1172,170],{"class":85},[79,1174,179],{"class":114},[79,1176,182],{"class":118},[79,1178,1179,1182],{"class":81,"line":253},[79,1180,1181],{"class":85},"        return",[79,1183,268],{"class":118},[79,1185,1186],{"class":81,"line":258},[79,1187,1188],{"class":118},"    }\n",[79,1190,1191],{"class":81,"line":271},[79,1192,105],{"emptyLinePlaceholder":104},[79,1194,1195,1197,1199,1201,1204,1206,1208],{"class":81,"line":562},[79,1196,164],{"class":114},[79,1198,167],{"class":118},[79,1200,170],{"class":85},[79,1202,1203],{"class":89}," \"2 秒到了：释放 work_guard\"",[79,1205,176],{"class":85},[79,1207,179],{"class":114},[79,1209,182],{"class":118},[79,1211,1212,1215,1218],{"class":81,"line":604},[79,1213,1214],{"class":118},"    guard->",[79,1216,1217],{"class":114},"reset",[79,1219,218],{"class":118},[79,1221,1222],{"class":81,"line":609},[79,1223,274],{"class":118},[79,1225,1226],{"class":81,"line":627},[79,1227,105],{"emptyLinePlaceholder":104},[79,1229,1230,1232,1234],{"class":81,"line":663},[79,1231,111],{"class":85},[79,1233,115],{"class":114},[79,1235,119],{"class":118},[79,1237,1238],{"class":81,"line":668},[79,1239,125],{"class":118},[79,1241,1242],{"class":81,"line":685},[79,1243,132],{"class":131},[79,1245,1246],{"class":81,"line":690},[79,1247,138],{"class":131},[79,1249,1250,1252,1254,1256],{"class":81,"line":695},[79,1251,144],{"class":114},[79,1253,147],{"class":118},[79,1255,150],{"class":114},[79,1257,153],{"class":118},[79,1259,1260],{"class":81,"line":714},[79,1261,105],{"emptyLinePlaceholder":104},[79,1263,1264,1266,1269,1271,1273,1276,1279],{"class":81,"line":719},[79,1265,164],{"class":114},[79,1267,1268],{"class":118},"::shared_ptr",[79,1270,1054],{"class":85},[79,1272,1122],{"class":118},[79,1274,1275],{"class":85},">",[79,1277,1278],{"class":118}," guard ",[79,1280,1281],{"class":85},"=\n",[79,1283,1284,1286,1288,1291,1293,1295,1298,1300,1302,1304,1306,1309],{"class":81,"line":745},[79,1285,1152],{"class":114},[79,1287,147],{"class":118},[79,1289,1290],{"class":114},"make_shared",[79,1292,1054],{"class":118},[79,1294,1122],{"class":114},[79,1296,1297],{"class":118},">(",[79,1299,852],{"class":114},[79,1301,147],{"class":118},[79,1303,150],{"class":114},[79,1305,147],{"class":118},[79,1307,1308],{"class":114},"make_work_guard",[79,1310,1311],{"class":118},"(io));\n",[79,1313,1314],{"class":81,"line":750},[79,1315,105],{"emptyLinePlaceholder":104},[79,1317,1318],{"class":81,"line":759},[79,1319,1320],{"class":131},"    \u002F\u002F 创建定时器，并设置到期时间。\n",[79,1322,1324,1326,1328,1330,1333,1336,1338,1340,1342,1345,1347,1350,1352,1355],{"class":81,"line":1323},33,[79,1325,144],{"class":114},[79,1327,147],{"class":118},[79,1329,150],{"class":114},[79,1331,1332],{"class":118},"::steady_timer ",[79,1334,1335],{"class":114},"timer",[79,1337,576],{"class":118},[79,1339,579],{"class":114},[79,1341,147],{"class":118},[79,1343,1344],{"class":114},"chrono",[79,1346,147],{"class":118},[79,1348,1349],{"class":114},"seconds",[79,1351,449],{"class":118},[79,1353,1354],{"class":264},"2",[79,1356,1357],{"class":118},"));\n",[79,1359,1361],{"class":81,"line":1360},34,[79,1362,105],{"emptyLinePlaceholder":104},[79,1364,1366],{"class":81,"line":1365},35,[79,1367,1368],{"class":131},"    \u002F\u002F 注册异步等待：这一行不会阻塞，回调会在定时器到期后执行。\n",[79,1370,1372,1375,1378,1380,1382,1384,1386],{"class":81,"line":1371},36,[79,1373,1374],{"class":118},"    timer.",[79,1376,1377],{"class":114},"async_wait",[79,1379,449],{"class":118},[79,1381,579],{"class":114},[79,1383,147],{"class":118},[79,1385,584],{"class":114},[79,1387,1388],{"class":118},"(release_guard,\n",[79,1390,1392,1395,1397,1400],{"class":81,"line":1391},37,[79,1393,1394],{"class":114},"                               std",[79,1396,147],{"class":118},[79,1398,1399],{"class":114},"placeholders",[79,1401,1402],{"class":118},"::_1,\n",[79,1404,1406],{"class":81,"line":1405},38,[79,1407,1408],{"class":118},"                               guard));\n",[79,1410,1412],{"class":81,"line":1411},39,[79,1413,105],{"emptyLinePlaceholder":104},[79,1415,1417,1419,1421,1423,1426,1428,1430],{"class":81,"line":1416},40,[79,1418,164],{"class":114},[79,1420,167],{"class":118},[79,1422,170],{"class":85},[79,1424,1425],{"class":89}," \"main：有 work_guard，io.run() 不会空转退出\"",[79,1427,176],{"class":85},[79,1429,179],{"class":114},[79,1431,182],{"class":118},[79,1433,1435],{"class":81,"line":1434},41,[79,1436,105],{"emptyLinePlaceholder":104},[79,1438,1440,1442,1444,1446,1448,1450,1452,1454],{"class":81,"line":1439},42,[79,1441,164],{"class":114},[79,1443,147],{"class":118},[79,1445,203],{"class":85},[79,1447,206],{"class":118},[79,1449,209],{"class":85},[79,1451,212],{"class":118},[79,1453,215],{"class":114},[79,1455,218],{"class":118},[79,1457,1459],{"class":81,"line":1458},43,[79,1460,105],{"emptyLinePlaceholder":104},[79,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484],{"class":81,"line":1463},44,[79,1465,164],{"class":114},[79,1467,167],{"class":118},[79,1469,170],{"class":85},[79,1471,235],{"class":89},[79,1473,176],{"class":85},[79,1475,206],{"class":118},[79,1477,170],{"class":85},[79,1479,244],{"class":89},[79,1481,176],{"class":85},[79,1483,179],{"class":114},[79,1485,182],{"class":118},[79,1487,1489],{"class":81,"line":1488},45,[79,1490,105],{"emptyLinePlaceholder":104},[79,1492,1494,1496,1498],{"class":81,"line":1493},46,[79,1495,261],{"class":85},[79,1497,265],{"class":264},[79,1499,268],{"class":118},[79,1501,1503],{"class":81,"line":1502},47,[79,1504,274],{"class":118},[13,1506,1507,281],{},[278,1508,280],{},[52,1510,285],{"id":1511},"compile-and-run-2",[70,1513,1515],{"className":288,"code":1514,"language":290,"meta":75,"style":75},"g++ demo3_work_guard.cpp -o demo3_work_guard -std=c++17 -lboost_system -pthread\n.\u002Fdemo3_work_guard\n",[17,1516,1517,1535],{"__ignoreMap":75},[79,1518,1519,1521,1524,1526,1529,1531,1533],{"class":81,"line":82},[79,1520,297],{"class":114},[79,1522,1523],{"class":89}," demo3_work_guard.cpp",[79,1525,303],{"class":264},[79,1527,1528],{"class":89}," demo3_work_guard",[79,1530,309],{"class":264},[79,1532,312],{"class":264},[79,1534,315],{"class":264},[79,1536,1537],{"class":81,"line":93},[79,1538,1539],{"class":114},".\u002Fdemo3_work_guard\n",[52,1541,324],{"id":1542},"execution-output-and-chronological-order-2",[13,1544,802],{},[70,1546,1549],{"className":1547,"code":1548,"language":333,"meta":75},[331],"main：有 work_guard，io.run() 不会空转退出\n",[17,1550,1548],{"__ignoreMap":75},[13,1552,1553],{},"Output in about 2 seconds:",[70,1555,1558],{"className":1556,"code":1557,"language":333,"meta":75},[331],"2 秒到了：释放 work_guard\nmain：io.run() 返回，执行了 1 个回调\n",[17,1559,1557],{"__ignoreMap":75},[13,1561,1562],{},"请提供您要翻译的简体中文 Markdown 片段。",[70,1564,1567],{"className":1565,"code":1566,"language":333,"meta":75},[331],"main：有 work_guard，io.run() 不会空转退出\n2 秒到了：释放 work_guard\nmain：io.run() 返回，执行了 1 个回调\n",[17,1568,1566],{"__ignoreMap":75},[52,1570,339],{"id":1571},"points-to-note-for-this-example-2",[13,1573,1574,1575,1577,1578,1580],{},"If there is only ",[17,1576,29],{},", but no timer to release it, then ",[17,1579,63],{}," will never return.",[13,1582,1583],{},"This is often done in the robot communication thread:",[70,1585,1588],{"className":1586,"code":1587,"language":333,"meta":75},[331],"创建 io_context\n创建 work_guard\n开一个线程 run()\n程序退出时 reset guard + stop io_context\n",[17,1589,1587],{"__ignoreMap":75},[52,1591,1593,894],{"id":1592},"make_work_guard-description",[17,1594,1595],{},"make_work_guard()",[70,1597,1599],{"className":72,"code":1598,"language":74,"meta":75,"style":75},"boost::asio::make_work_guard(io)\n",[17,1600,1601],{"__ignoreMap":75},[79,1602,1603,1605,1607,1609,1611,1613],{"class":81,"line":82},[79,1604,852],{"class":114},[79,1606,147],{"class":118},[79,1608,150],{"class":114},[79,1610,147],{"class":118},[79,1612,1308],{"class":114},[79,1614,1615],{"class":118},"(io)\n",[13,1617,1618,1619,1621],{},"Purpose: Create a guard so that ",[17,1620,19],{}," thinks \"there is still unfinished work.\"",[13,1623,1624,1625,1628,1629,1631],{},"After ",[17,1626,1627],{},"guard.reset()",", if there are no other tasks at this time, ",[17,1630,63],{}," can return.",[38,1633],{},[41,1635,1637,1638],{"id":1636},"example-4-ordinary-function-parameter-binding-of-stdbind","Example 4: Ordinary function parameter binding of ",[17,1639,35],{},[52,1641,55],{"id":1642},"program-objective-3",[13,1644,1645,1646,1648,1649,1652],{},"Practice specifically on ",[17,1647,35],{},", and clearly distinguish ",[17,1650,1651],{},"_1",", fixed parameters, and parameter order.",[52,1654,68],{"id":1655},"full-code-3",[70,1657,1659],{"className":72,"code":1658,"language":74,"meta":75,"style":75},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nvoid print_robot_state(const std::string& name, double x, double y)\n{\n    std::cout \u003C\u003C \"机器人：\" \u003C\u003C name \u003C\u003C \"，x = \" \u003C\u003C x \u003C\u003C \"，y = \" \u003C\u003C y \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    \u002F\u002F std::function 可以保存普通函数、lambda 或函数对象。\n    std::function\u003Cvoid(double, double)> f =\n        \u002F\u002F bind 会把函数和部分参数提前绑定成一个可调用对象。\n        std::bind(print_robot_state,\n                  std::string(\"mycar\"),\n                  std::placeholders::_1,\n                  std::placeholders::_2);\n\n    std::cout \u003C\u003C \"main：准备调用绑定后的函数\" \u003C\u003C std::endl;\n\n    f(1.2, 3.4);\n    f(5.6, 7.8);\n\n    std::cout \u003C\u003C \"main：结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,1660,1661,1667,1673,1679,1683,1722,1726,1768,1772,1776,1784,1788,1792,1797,1825,1830,1841,1858,1868,1879,1883,1900,1904,1921,1937,1941,1958,1962,1970],{"__ignoreMap":75},[79,1662,1663,1665],{"class":81,"line":82},[79,1664,86],{"class":85},[79,1666,421],{"class":89},[79,1668,1669,1671],{"class":81,"line":93},[79,1670,86],{"class":85},[79,1672,98],{"class":89},[79,1674,1675,1677],{"class":81,"line":101},[79,1676,86],{"class":85},[79,1678,434],{"class":89},[79,1680,1681],{"class":81,"line":108},[79,1682,105],{"emptyLinePlaceholder":104},[79,1684,1685,1687,1690,1692,1694,1696,1698,1700,1702,1705,1707,1710,1713,1715,1717,1720],{"class":81,"line":122},[79,1686,443],{"class":85},[79,1688,1689],{"class":114}," print_robot_state",[79,1691,449],{"class":118},[79,1693,452],{"class":85},[79,1695,179],{"class":114},[79,1697,147],{"class":118},[79,1699,459],{"class":114},[79,1701,462],{"class":85},[79,1703,1704],{"class":465}," name",[79,1706,20],{"class":118},[79,1708,1709],{"class":85},"double",[79,1711,1712],{"class":465}," x",[79,1714,20],{"class":118},[79,1716,1709],{"class":85},[79,1718,1719],{"class":465}," y",[79,1721,469],{"class":118},[79,1723,1724],{"class":81,"line":128},[79,1725,125],{"class":118},[79,1727,1728,1730,1732,1734,1737,1739,1742,1744,1747,1749,1752,1754,1757,1759,1762,1764,1766],{"class":81,"line":135},[79,1729,164],{"class":114},[79,1731,167],{"class":118},[79,1733,170],{"class":85},[79,1735,1736],{"class":89}," \"机器人：\"",[79,1738,176],{"class":85},[79,1740,1741],{"class":118}," name ",[79,1743,170],{"class":85},[79,1745,1746],{"class":89}," \"，x = \"",[79,1748,176],{"class":85},[79,1750,1751],{"class":118}," x ",[79,1753,170],{"class":85},[79,1755,1756],{"class":89}," \"，y = \"",[79,1758,176],{"class":85},[79,1760,1761],{"class":118}," y ",[79,1763,170],{"class":85},[79,1765,179],{"class":114},[79,1767,182],{"class":118},[79,1769,1770],{"class":81,"line":141},[79,1771,274],{"class":118},[79,1773,1774],{"class":81,"line":156},[79,1775,105],{"emptyLinePlaceholder":104},[79,1777,1778,1780,1782],{"class":81,"line":161},[79,1779,111],{"class":85},[79,1781,115],{"class":114},[79,1783,119],{"class":118},[79,1785,1786],{"class":81,"line":185},[79,1787,125],{"class":118},[79,1789,1790],{"class":81,"line":190},[79,1791,132],{"class":131},[79,1793,1794],{"class":81,"line":196},[79,1795,1796],{"class":131},"    \u002F\u002F std::function 可以保存普通函数、lambda 或函数对象。\n",[79,1798,1799,1801,1804,1807,1809,1811,1813,1815,1818,1820,1823],{"class":81,"line":221},[79,1800,164],{"class":114},[79,1802,1803],{"class":118},"::function",[79,1805,1806],{"class":85},"\u003Cvoid",[79,1808,449],{"class":118},[79,1810,1709],{"class":85},[79,1812,20],{"class":118},[79,1814,1709],{"class":85},[79,1816,1817],{"class":118},")",[79,1819,1275],{"class":85},[79,1821,1822],{"class":118}," f ",[79,1824,1281],{"class":85},[79,1826,1827],{"class":81,"line":226},[79,1828,1829],{"class":131},"        \u002F\u002F bind 会把函数和部分参数提前绑定成一个可调用对象。\n",[79,1831,1832,1834,1836,1838],{"class":81,"line":253},[79,1833,1152],{"class":114},[79,1835,147],{"class":118},[79,1837,584],{"class":114},[79,1839,1840],{"class":118},"(print_robot_state,\n",[79,1842,1843,1846,1848,1850,1852,1855],{"class":81,"line":258},[79,1844,1845],{"class":114},"                  std",[79,1847,147],{"class":118},[79,1849,459],{"class":114},[79,1851,449],{"class":118},[79,1853,1854],{"class":89},"\"mycar\"",[79,1856,1857],{"class":118},"),\n",[79,1859,1860,1862,1864,1866],{"class":81,"line":271},[79,1861,1845],{"class":114},[79,1863,147],{"class":118},[79,1865,1399],{"class":114},[79,1867,1402],{"class":118},[79,1869,1870,1872,1874,1876],{"class":81,"line":562},[79,1871,1845],{"class":114},[79,1873,147],{"class":118},[79,1875,1399],{"class":114},[79,1877,1878],{"class":118},"::_2);\n",[79,1880,1881],{"class":81,"line":604},[79,1882,105],{"emptyLinePlaceholder":104},[79,1884,1885,1887,1889,1891,1894,1896,1898],{"class":81,"line":609},[79,1886,164],{"class":114},[79,1888,167],{"class":118},[79,1890,170],{"class":85},[79,1892,1893],{"class":89}," \"main：准备调用绑定后的函数\"",[79,1895,176],{"class":85},[79,1897,179],{"class":114},[79,1899,182],{"class":118},[79,1901,1902],{"class":81,"line":627},[79,1903,105],{"emptyLinePlaceholder":104},[79,1905,1906,1909,1911,1914,1916,1919],{"class":81,"line":663},[79,1907,1908],{"class":114},"    f",[79,1910,449],{"class":118},[79,1912,1913],{"class":264},"1.2",[79,1915,20],{"class":118},[79,1917,1918],{"class":264},"3.4",[79,1920,942],{"class":118},[79,1922,1923,1925,1927,1930,1932,1935],{"class":81,"line":668},[79,1924,1908],{"class":114},[79,1926,449],{"class":118},[79,1928,1929],{"class":264},"5.6",[79,1931,20],{"class":118},[79,1933,1934],{"class":264},"7.8",[79,1936,942],{"class":118},[79,1938,1939],{"class":81,"line":685},[79,1940,105],{"emptyLinePlaceholder":104},[79,1942,1943,1945,1947,1949,1952,1954,1956],{"class":81,"line":690},[79,1944,164],{"class":114},[79,1946,167],{"class":118},[79,1948,170],{"class":85},[79,1950,1951],{"class":89}," \"main：结束\"",[79,1953,176],{"class":85},[79,1955,179],{"class":114},[79,1957,182],{"class":118},[79,1959,1960],{"class":81,"line":695},[79,1961,105],{"emptyLinePlaceholder":104},[79,1963,1964,1966,1968],{"class":81,"line":714},[79,1965,261],{"class":85},[79,1967,265],{"class":264},[79,1969,268],{"class":118},[79,1971,1972],{"class":81,"line":719},[79,1973,274],{"class":118},[13,1975,1976,281],{},[278,1977,280],{},[52,1979,285],{"id":1980},"compile-and-run-3",[70,1982,1984],{"className":288,"code":1983,"language":290,"meta":75,"style":75},"g++ demo4_bind_basic.cpp -o demo4_bind_basic -std=c++17\n.\u002Fdemo4_bind_basic\n",[17,1985,1986,2001],{"__ignoreMap":75},[79,1987,1988,1990,1993,1995,1998],{"class":81,"line":82},[79,1989,297],{"class":114},[79,1991,1992],{"class":89}," demo4_bind_basic.cpp",[79,1994,303],{"class":264},[79,1996,1997],{"class":89}," demo4_bind_basic",[79,1999,2000],{"class":264}," -std=c++17\n",[79,2002,2003],{"class":81,"line":93},[79,2004,2005],{"class":114},".\u002Fdemo4_bind_basic\n",[52,2007,2009],{"id":2008},"run-output","Run output",[70,2011,2014],{"className":2012,"code":2013,"language":333,"meta":75},[331],"main：准备调用绑定后的函数\n机器人：mycar，x = 1.2，y = 3.4\n机器人：mycar，x = 5.6，y = 7.8\nmain：结束\n",[17,2015,2013],{"__ignoreMap":75},[52,2017,339],{"id":2018},"points-to-note-for-this-example-3",[13,2020,2021],{},"This sentence:",[70,2023,2025],{"className":72,"code":2024,"language":74,"meta":75,"style":75},"std::bind(print_robot_state,\n          std::string(\"mycar\"),\n          std::placeholders::_1,\n          std::placeholders::_2)\n",[17,2026,2027,2037,2052,2062],{"__ignoreMap":75},[79,2028,2029,2031,2033,2035],{"class":81,"line":82},[79,2030,579],{"class":114},[79,2032,147],{"class":118},[79,2034,584],{"class":114},[79,2036,1840],{"class":118},[79,2038,2039,2042,2044,2046,2048,2050],{"class":81,"line":93},[79,2040,2041],{"class":114},"          std",[79,2043,147],{"class":118},[79,2045,459],{"class":114},[79,2047,449],{"class":118},[79,2049,1854],{"class":89},[79,2051,1857],{"class":118},[79,2053,2054,2056,2058,2060],{"class":81,"line":101},[79,2055,2041],{"class":114},[79,2057,147],{"class":118},[79,2059,1399],{"class":114},[79,2061,1402],{"class":118},[79,2063,2064,2066,2068,2070],{"class":81,"line":108},[79,2065,2041],{"class":114},[79,2067,147],{"class":118},[79,2069,1399],{"class":114},[79,2071,2072],{"class":118},"::_2)\n",[13,2074,2075],{},"Indicates:",[70,2077,2080],{"className":2078,"code":2079,"language":333,"meta":75},[331],"第 1 个参数固定成 \"mycar\"\n未来传入的第 1 个参数放到 x\n未来传入的第 2 个参数放到 y\n",[17,2081,2079],{"__ignoreMap":75},[13,2083,2084],{},"So:",[70,2086,2088],{"className":72,"code":2087,"language":74,"meta":75,"style":75},"f(1.2, 3.4);\n",[17,2089,2090],{"__ignoreMap":75},[79,2091,2092,2095,2097,2099,2101,2103],{"class":81,"line":82},[79,2093,2094],{"class":114},"f",[79,2096,449],{"class":118},[79,2098,1913],{"class":264},[79,2100,20],{"class":118},[79,2102,1918],{"class":264},[79,2104,942],{"class":118},[13,2106,2107],{},"Equivalent to:",[70,2109,2111],{"className":72,"code":2110,"language":74,"meta":75,"style":75},"print_robot_state(\"mycar\", 1.2, 3.4);\n",[17,2112,2113],{"__ignoreMap":75},[79,2114,2115,2118,2120,2122,2124,2126,2128,2130],{"class":81,"line":82},[79,2116,2117],{"class":114},"print_robot_state",[79,2119,449],{"class":118},[79,2121,1854],{"class":89},[79,2123,20],{"class":118},[79,2125,1913],{"class":264},[79,2127,20],{"class":118},[79,2129,1918],{"class":264},[79,2131,942],{"class":118},[38,2133],{},[41,2135,2137,2138],{"id":2136},"example-5-class-member-function-using-stdbind","Example 5: Class member function using ",[17,2139,35],{},[52,2141,55],{"id":2142},"program-objective-4",[13,2144,2145],{},"Understand why member functions are written:",[70,2147,2149],{"className":72,"code":2148,"language":74,"meta":75,"style":75},"&ClassName::function_name\nthis\n",[17,2150,2151,2161],{"__ignoreMap":75},[79,2152,2153,2155,2158],{"class":81,"line":82},[79,2154,462],{"class":85},[79,2156,2157],{"class":114},"ClassName",[79,2159,2160],{"class":118},"::function_name\n",[79,2162,2163],{"class":81,"line":93},[79,2164,2165],{"class":264},"this\n",[52,2167,68],{"id":2168},"full-code-4",[70,2170,2172],{"className":72,"code":2171,"language":74,"meta":75,"style":75},"#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nclass Robot\n{\npublic:\n    explicit Robot(const std::string& name)\n        : name_(name)\n    {\n    }\n\n    void print_pose(double x, double y)\n    {\n        std::cout \u003C\u003C \"机器人：\" \u003C\u003C name_ \u003C\u003C \"，x = \" \u003C\u003C x \u003C\u003C \"，y = \" \u003C\u003C y \u003C\u003C std::endl;\n    }\n\nprivate:\n    std::string name_;\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    Robot robot(\"mycar\");\n\n    \u002F\u002F std::function 可以保存普通函数、lambda 或函数对象。\n    std::function\u003Cvoid(double, double)> f =\n        \u002F\u002F bind 会把函数和部分参数提前绑定成一个可调用对象。\n        std::bind(&Robot::print_pose,\n                  &robot,\n                  std::placeholders::_1,\n                  std::placeholders::_2);\n\n    std::cout \u003C\u003C \"main：准备调用成员函数绑定对象\" \u003C\u003C std::endl;\n\n    f(1.0, 2.0);\n    f(3.0, 4.0);\n\n    std::cout \u003C\u003C \"main：结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,2173,2174,2180,2186,2192,2196,2204,2208,2213,2237,2248,2252,2256,2260,2282,2286,2323,2327,2331,2336,2343,2348,2352,2360,2364,2368,2382,2386,2390,2414,2418,2436,2444,2454,2464,2468,2485,2489,2505,2521,2525,2541,2545,2553],{"__ignoreMap":75},[79,2175,2176,2178],{"class":81,"line":82},[79,2177,86],{"class":85},[79,2179,421],{"class":89},[79,2181,2182,2184],{"class":81,"line":93},[79,2183,86],{"class":85},[79,2185,98],{"class":89},[79,2187,2188,2190],{"class":81,"line":101},[79,2189,86],{"class":85},[79,2191,434],{"class":89},[79,2193,2194],{"class":81,"line":108},[79,2195,105],{"emptyLinePlaceholder":104},[79,2197,2198,2201],{"class":81,"line":122},[79,2199,2200],{"class":85},"class",[79,2202,2203],{"class":114}," Robot\n",[79,2205,2206],{"class":81,"line":128},[79,2207,125],{"class":118},[79,2209,2210],{"class":81,"line":135},[79,2211,2212],{"class":85},"public:\n",[79,2214,2215,2218,2221,2223,2225,2227,2229,2231,2233,2235],{"class":81,"line":141},[79,2216,2217],{"class":85},"    explicit",[79,2219,2220],{"class":114}," Robot",[79,2222,449],{"class":118},[79,2224,452],{"class":85},[79,2226,179],{"class":114},[79,2228,147],{"class":118},[79,2230,459],{"class":114},[79,2232,462],{"class":85},[79,2234,1704],{"class":465},[79,2236,469],{"class":118},[79,2238,2239,2242,2245],{"class":81,"line":156},[79,2240,2241],{"class":118},"        : ",[79,2243,2244],{"class":114},"name_",[79,2246,2247],{"class":118},"(name)\n",[79,2249,2250],{"class":81,"line":161},[79,2251,1147],{"class":118},[79,2253,2254],{"class":81,"line":185},[79,2255,1188],{"class":118},[79,2257,2258],{"class":81,"line":190},[79,2259,105],{"emptyLinePlaceholder":104},[79,2261,2262,2265,2268,2270,2272,2274,2276,2278,2280],{"class":81,"line":196},[79,2263,2264],{"class":85},"    void",[79,2266,2267],{"class":114}," print_pose",[79,2269,449],{"class":118},[79,2271,1709],{"class":85},[79,2273,1712],{"class":465},[79,2275,20],{"class":118},[79,2277,1709],{"class":85},[79,2279,1719],{"class":465},[79,2281,469],{"class":118},[79,2283,2284],{"class":81,"line":221},[79,2285,1147],{"class":118},[79,2287,2288,2290,2292,2294,2296,2298,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321],{"class":81,"line":226},[79,2289,1152],{"class":114},[79,2291,167],{"class":118},[79,2293,170],{"class":85},[79,2295,1736],{"class":89},[79,2297,176],{"class":85},[79,2299,2300],{"class":118}," name_ ",[79,2302,170],{"class":85},[79,2304,1746],{"class":89},[79,2306,176],{"class":85},[79,2308,1751],{"class":118},[79,2310,170],{"class":85},[79,2312,1756],{"class":89},[79,2314,176],{"class":85},[79,2316,1761],{"class":118},[79,2318,170],{"class":85},[79,2320,179],{"class":114},[79,2322,182],{"class":118},[79,2324,2325],{"class":81,"line":253},[79,2326,1188],{"class":118},[79,2328,2329],{"class":81,"line":258},[79,2330,105],{"emptyLinePlaceholder":104},[79,2332,2333],{"class":81,"line":271},[79,2334,2335],{"class":85},"private:\n",[79,2337,2338,2340],{"class":81,"line":562},[79,2339,164],{"class":114},[79,2341,2342],{"class":118},"::string name_;\n",[79,2344,2345],{"class":81,"line":604},[79,2346,2347],{"class":118},"};\n",[79,2349,2350],{"class":81,"line":609},[79,2351,105],{"emptyLinePlaceholder":104},[79,2353,2354,2356,2358],{"class":81,"line":627},[79,2355,111],{"class":85},[79,2357,115],{"class":114},[79,2359,119],{"class":118},[79,2361,2362],{"class":81,"line":663},[79,2363,125],{"class":118},[79,2365,2366],{"class":81,"line":668},[79,2367,132],{"class":131},[79,2369,2370,2373,2376,2378,2380],{"class":81,"line":685},[79,2371,2372],{"class":118},"    Robot ",[79,2374,2375],{"class":114},"robot",[79,2377,449],{"class":118},[79,2379,1854],{"class":89},[79,2381,942],{"class":118},[79,2383,2384],{"class":81,"line":690},[79,2385,105],{"emptyLinePlaceholder":104},[79,2387,2388],{"class":81,"line":695},[79,2389,1796],{"class":131},[79,2391,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412],{"class":81,"line":714},[79,2393,164],{"class":114},[79,2395,1803],{"class":118},[79,2397,1806],{"class":85},[79,2399,449],{"class":118},[79,2401,1709],{"class":85},[79,2403,20],{"class":118},[79,2405,1709],{"class":85},[79,2407,1817],{"class":118},[79,2409,1275],{"class":85},[79,2411,1822],{"class":118},[79,2413,1281],{"class":85},[79,2415,2416],{"class":81,"line":719},[79,2417,1829],{"class":131},[79,2419,2420,2422,2424,2426,2428,2430,2433],{"class":81,"line":745},[79,2421,1152],{"class":114},[79,2423,147],{"class":118},[79,2425,584],{"class":114},[79,2427,449],{"class":118},[79,2429,462],{"class":85},[79,2431,2432],{"class":114},"Robot",[79,2434,2435],{"class":118},"::print_pose,\n",[79,2437,2438,2441],{"class":81,"line":750},[79,2439,2440],{"class":85},"                  &",[79,2442,2443],{"class":118},"robot,\n",[79,2445,2446,2448,2450,2452],{"class":81,"line":759},[79,2447,1845],{"class":114},[79,2449,147],{"class":118},[79,2451,1399],{"class":114},[79,2453,1402],{"class":118},[79,2455,2456,2458,2460,2462],{"class":81,"line":1323},[79,2457,1845],{"class":114},[79,2459,147],{"class":118},[79,2461,1399],{"class":114},[79,2463,1878],{"class":118},[79,2465,2466],{"class":81,"line":1360},[79,2467,105],{"emptyLinePlaceholder":104},[79,2469,2470,2472,2474,2476,2479,2481,2483],{"class":81,"line":1365},[79,2471,164],{"class":114},[79,2473,167],{"class":118},[79,2475,170],{"class":85},[79,2477,2478],{"class":89}," \"main：准备调用成员函数绑定对象\"",[79,2480,176],{"class":85},[79,2482,179],{"class":114},[79,2484,182],{"class":118},[79,2486,2487],{"class":81,"line":1371},[79,2488,105],{"emptyLinePlaceholder":104},[79,2490,2491,2493,2495,2498,2500,2503],{"class":81,"line":1391},[79,2492,1908],{"class":114},[79,2494,449],{"class":118},[79,2496,2497],{"class":264},"1.0",[79,2499,20],{"class":118},[79,2501,2502],{"class":264},"2.0",[79,2504,942],{"class":118},[79,2506,2507,2509,2511,2514,2516,2519],{"class":81,"line":1405},[79,2508,1908],{"class":114},[79,2510,449],{"class":118},[79,2512,2513],{"class":264},"3.0",[79,2515,20],{"class":118},[79,2517,2518],{"class":264},"4.0",[79,2520,942],{"class":118},[79,2522,2523],{"class":81,"line":1411},[79,2524,105],{"emptyLinePlaceholder":104},[79,2526,2527,2529,2531,2533,2535,2537,2539],{"class":81,"line":1416},[79,2528,164],{"class":114},[79,2530,167],{"class":118},[79,2532,170],{"class":85},[79,2534,1951],{"class":89},[79,2536,176],{"class":85},[79,2538,179],{"class":114},[79,2540,182],{"class":118},[79,2542,2543],{"class":81,"line":1434},[79,2544,105],{"emptyLinePlaceholder":104},[79,2546,2547,2549,2551],{"class":81,"line":1439},[79,2548,261],{"class":85},[79,2550,265],{"class":264},[79,2552,268],{"class":118},[79,2554,2555],{"class":81,"line":1458},[79,2556,274],{"class":118},[13,2558,2559,281],{},[278,2560,280],{},[52,2562,285],{"id":2563},"compile-and-run-4",[70,2565,2567],{"className":288,"code":2566,"language":290,"meta":75,"style":75},"g++ demo5_bind_member.cpp -o demo5_bind_member -std=c++17\n.\u002Fdemo5_bind_member\n",[17,2568,2569,2583],{"__ignoreMap":75},[79,2570,2571,2573,2576,2578,2581],{"class":81,"line":82},[79,2572,297],{"class":114},[79,2574,2575],{"class":89}," demo5_bind_member.cpp",[79,2577,303],{"class":264},[79,2579,2580],{"class":89}," demo5_bind_member",[79,2582,2000],{"class":264},[79,2584,2585],{"class":81,"line":93},[79,2586,2587],{"class":114},".\u002Fdemo5_bind_member\n",[52,2589,2009],{"id":2590},"run-output-1",[70,2592,2595],{"className":2593,"code":2594,"language":333,"meta":75},[331],"main：准备调用成员函数绑定对象\n机器人：mycar，x = 1，y = 2\n机器人：mycar，x = 3，y = 4\nmain：结束\n",[17,2596,2594],{"__ignoreMap":75},[52,2598,339],{"id":2599},"points-to-note-for-this-example-4",[13,2601,2602],{},"Regular function binding:",[70,2604,2606],{"className":72,"code":2605,"language":74,"meta":75,"style":75},"std::bind(print_robot_state, ...)\n",[17,2607,2608],{"__ignoreMap":75},[79,2609,2610,2612,2614,2616],{"class":81,"line":82},[79,2611,579],{"class":114},[79,2613,147],{"class":118},[79,2615,584],{"class":114},[79,2617,2618],{"class":118},"(print_robot_state, ...)\n",[13,2620,2621],{},"Member function binding:",[70,2623,2625],{"className":72,"code":2624,"language":74,"meta":75,"style":75},"std::bind(&Robot::print_pose, &robot, ...)\n",[17,2626,2627],{"__ignoreMap":75},[79,2628,2629,2631,2633,2635,2637,2639,2641,2644,2646],{"class":81,"line":82},[79,2630,579],{"class":114},[79,2632,147],{"class":118},[79,2634,584],{"class":114},[79,2636,449],{"class":118},[79,2638,462],{"class":85},[79,2640,2432],{"class":114},[79,2642,2643],{"class":118},"::print_pose, ",[79,2645,462],{"class":85},[79,2647,2648],{"class":118},"robot, ...)\n",[13,2650,2651],{},"Reason: Member functions must be called on an object.",[52,2653,2655,2656,2659],{"id":2654},"what-is-robotprint_pose","What is ",[17,2657,2658],{},"&Robot::print_pose","?",[13,2661,2662],{},"It is a member function pointer, representing the print_pose function in the Robot class.",[13,2664,2665],{},"But it hasn't specified a specific object yet.",[52,2667,2655,2669,2659],{"id":2668},"what-is-robot",[17,2670,2671],{},"&robot",[13,2673,2674],{},"It indicates which object's member function is being called.",[13,2676,2677],{},"So the full meaning is:",[70,2679,2682],{"className":2680,"code":2681,"language":333,"meta":75},[331],"未来调用 robot.print_pose(x, y)。\n",[17,2683,2681],{"__ignoreMap":75},[38,2685],{},[41,2687,2689,2690],{"id":2688},"example-6-basic-usage-of-buffer","Example 6: Basic Usage of ",[17,2691,32],{},[52,2693,55],{"id":2694},"program-objective-5",[13,2696,2697],{},"When reading and writing data with Boost.Asio, one often writes:",[70,2699,2701],{"className":72,"code":2700,"language":74,"meta":75,"style":75},"boost::asio::buffer(data)\n",[17,2702,2703],{"__ignoreMap":75},[79,2704,2705,2707,2709,2711,2713,2715],{"class":81,"line":82},[79,2706,852],{"class":114},[79,2708,147],{"class":118},[79,2710,150],{"class":114},[79,2712,147],{"class":118},[79,2714,32],{"class":114},[79,2716,2717],{"class":118},"(data)\n",[13,2719,2720],{},"This example first examines its basic meaning.",[52,2722,68],{"id":2723},"full-code-5",[70,2725,2727],{"className":72,"code":2726,"language":74,"meta":75,"style":75},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Carray>\n#include \u003Ciostream>\n#include \u003Cstring>\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    std::string msg = \"hello asio\";\n    auto buf1 = boost::asio::buffer(msg);\n\n    \u002F\u002F std::array 是固定长度数组，长度在编译期就确定。\n    std::array\u003Cchar, 128> data;\n    auto buf2 = boost::asio::buffer(data);\n\n    std::cout \u003C\u003C \"msg.size() = \" \u003C\u003C msg.size() \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"buffer(msg).size() = \" \u003C\u003C buf1.size() \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"array size = \" \u003C\u003C data.size() \u003C\u003C std::endl;\n    std::cout \u003C\u003C \"buffer(data).size() = \" \u003C\u003C buf2.size() \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,2728,2729,2735,2742,2748,2754,2758,2766,2770,2774,2788,2811,2815,2820,2840,2862,2866,2893,2919,2945,2971,2975,2983],{"__ignoreMap":75},[79,2730,2731,2733],{"class":81,"line":82},[79,2732,86],{"class":85},[79,2734,90],{"class":89},[79,2736,2737,2739],{"class":81,"line":93},[79,2738,86],{"class":85},[79,2740,2741],{"class":89}," \u003Carray>\n",[79,2743,2744,2746],{"class":81,"line":101},[79,2745,86],{"class":85},[79,2747,98],{"class":89},[79,2749,2750,2752],{"class":81,"line":108},[79,2751,86],{"class":85},[79,2753,434],{"class":89},[79,2755,2756],{"class":81,"line":122},[79,2757,105],{"emptyLinePlaceholder":104},[79,2759,2760,2762,2764],{"class":81,"line":128},[79,2761,111],{"class":85},[79,2763,115],{"class":114},[79,2765,119],{"class":118},[79,2767,2768],{"class":81,"line":135},[79,2769,125],{"class":118},[79,2771,2772],{"class":81,"line":141},[79,2773,132],{"class":131},[79,2775,2776,2778,2781,2783,2786],{"class":81,"line":156},[79,2777,164],{"class":114},[79,2779,2780],{"class":118},"::string msg ",[79,2782,209],{"class":85},[79,2784,2785],{"class":89}," \"hello asio\"",[79,2787,268],{"class":118},[79,2789,2790,2793,2796,2798,2800,2802,2804,2806,2808],{"class":81,"line":161},[79,2791,2792],{"class":85},"    auto",[79,2794,2795],{"class":118}," buf1 ",[79,2797,209],{"class":85},[79,2799,1043],{"class":114},[79,2801,147],{"class":118},[79,2803,150],{"class":114},[79,2805,147],{"class":118},[79,2807,32],{"class":114},[79,2809,2810],{"class":118},"(msg);\n",[79,2812,2813],{"class":81,"line":185},[79,2814,105],{"emptyLinePlaceholder":104},[79,2816,2817],{"class":81,"line":190},[79,2818,2819],{"class":131},"    \u002F\u002F std::array 是固定长度数组，长度在编译期就确定。\n",[79,2821,2822,2824,2827,2830,2832,2835,2837],{"class":81,"line":196},[79,2823,164],{"class":114},[79,2825,2826],{"class":118},"::array",[79,2828,2829],{"class":85},"\u003Cchar",[79,2831,20],{"class":118},[79,2833,2834],{"class":264},"128",[79,2836,1275],{"class":85},[79,2838,2839],{"class":118}," data;\n",[79,2841,2842,2844,2847,2849,2851,2853,2855,2857,2859],{"class":81,"line":221},[79,2843,2792],{"class":85},[79,2845,2846],{"class":118}," buf2 ",[79,2848,209],{"class":85},[79,2850,1043],{"class":114},[79,2852,147],{"class":118},[79,2854,150],{"class":114},[79,2856,147],{"class":118},[79,2858,32],{"class":114},[79,2860,2861],{"class":118},"(data);\n",[79,2863,2864],{"class":81,"line":226},[79,2865,105],{"emptyLinePlaceholder":104},[79,2867,2868,2870,2872,2874,2877,2879,2882,2885,2887,2889,2891],{"class":81,"line":253},[79,2869,164],{"class":114},[79,2871,167],{"class":118},[79,2873,170],{"class":85},[79,2875,2876],{"class":89}," \"msg.size() = \"",[79,2878,176],{"class":85},[79,2880,2881],{"class":118}," msg.",[79,2883,2884],{"class":114},"size",[79,2886,1170],{"class":118},[79,2888,170],{"class":85},[79,2890,179],{"class":114},[79,2892,182],{"class":118},[79,2894,2895,2897,2899,2901,2904,2906,2909,2911,2913,2915,2917],{"class":81,"line":258},[79,2896,164],{"class":114},[79,2898,167],{"class":118},[79,2900,170],{"class":85},[79,2902,2903],{"class":89}," \"buffer(msg).size() = \"",[79,2905,176],{"class":85},[79,2907,2908],{"class":118}," buf1.",[79,2910,2884],{"class":114},[79,2912,1170],{"class":118},[79,2914,170],{"class":85},[79,2916,179],{"class":114},[79,2918,182],{"class":118},[79,2920,2921,2923,2925,2927,2930,2932,2935,2937,2939,2941,2943],{"class":81,"line":271},[79,2922,164],{"class":114},[79,2924,167],{"class":118},[79,2926,170],{"class":85},[79,2928,2929],{"class":89}," \"array size = \"",[79,2931,176],{"class":85},[79,2933,2934],{"class":118}," data.",[79,2936,2884],{"class":114},[79,2938,1170],{"class":118},[79,2940,170],{"class":85},[79,2942,179],{"class":114},[79,2944,182],{"class":118},[79,2946,2947,2949,2951,2953,2956,2958,2961,2963,2965,2967,2969],{"class":81,"line":562},[79,2948,164],{"class":114},[79,2950,167],{"class":118},[79,2952,170],{"class":85},[79,2954,2955],{"class":89}," \"buffer(data).size() = \"",[79,2957,176],{"class":85},[79,2959,2960],{"class":118}," buf2.",[79,2962,2884],{"class":114},[79,2964,1170],{"class":118},[79,2966,170],{"class":85},[79,2968,179],{"class":114},[79,2970,182],{"class":118},[79,2972,2973],{"class":81,"line":604},[79,2974,105],{"emptyLinePlaceholder":104},[79,2976,2977,2979,2981],{"class":81,"line":609},[79,2978,261],{"class":85},[79,2980,265],{"class":264},[79,2982,268],{"class":118},[79,2984,2985],{"class":81,"line":627},[79,2986,274],{"class":118},[13,2988,2989,281],{},[278,2990,280],{},[52,2992,285],{"id":2993},"compile-and-run-5",[70,2995,2997],{"className":288,"code":2996,"language":290,"meta":75,"style":75},"g++ demo6_buffer.cpp -o demo6_buffer -std=c++17 -lboost_system -pthread\n.\u002Fdemo6_buffer\n",[17,2998,2999,3017],{"__ignoreMap":75},[79,3000,3001,3003,3006,3008,3011,3013,3015],{"class":81,"line":82},[79,3002,297],{"class":114},[79,3004,3005],{"class":89}," demo6_buffer.cpp",[79,3007,303],{"class":264},[79,3009,3010],{"class":89}," demo6_buffer",[79,3012,309],{"class":264},[79,3014,312],{"class":264},[79,3016,315],{"class":264},[79,3018,3019],{"class":81,"line":93},[79,3020,3021],{"class":114},".\u002Fdemo6_buffer\n",[52,3023,2009],{"id":3024},"run-output-2",[70,3026,3029],{"className":3027,"code":3028,"language":333,"meta":75},[331],"msg.size() = 10\nbuffer(msg).size() = 10\narray size = 128\nbuffer(data).size() = 128\n",[17,3030,3028],{"__ignoreMap":75},[52,3032,339],{"id":3033},"points-to-note-for-this-example-5",[13,3035,3036,3039],{},[17,3037,3038],{},"boost::asio::buffer()"," typically does not copy data; it just creates a \"buffer view pointing to existing memory.\"",[13,3041,3042],{},"Therefore, pay special attention when performing asynchronous reads and writes:",[70,3044,3047],{"className":3045,"code":3046,"language":333,"meta":75},[331],"buffer 指向的原始数据必须活到异步回调完成。\n",[17,3048,3046],{"__ignoreMap":75},[13,3050,3051],{},"Example of incorrect writing:",[70,3053,3055],{"className":72,"code":3054,"language":74,"meta":75,"style":75},"void send()\n{\n    std::string msg = \"hello\";\n    boost::asio::async_write(socket_, boost::asio::buffer(msg), handler);\n}\n",[17,3056,3057,3066,3070,3083,3112],{"__ignoreMap":75},[79,3058,3059,3061,3064],{"class":81,"line":82},[79,3060,443],{"class":85},[79,3062,3063],{"class":114}," send",[79,3065,119],{"class":118},[79,3067,3068],{"class":81,"line":93},[79,3069,125],{"class":118},[79,3071,3072,3074,3076,3078,3081],{"class":81,"line":101},[79,3073,164],{"class":114},[79,3075,2780],{"class":118},[79,3077,209],{"class":85},[79,3079,3080],{"class":89}," \"hello\"",[79,3082,268],{"class":118},[79,3084,3085,3087,3089,3091,3093,3096,3099,3101,3103,3105,3107,3109],{"class":81,"line":108},[79,3086,144],{"class":114},[79,3088,147],{"class":118},[79,3090,150],{"class":114},[79,3092,147],{"class":118},[79,3094,3095],{"class":114},"async_write",[79,3097,3098],{"class":118},"(socket_, ",[79,3100,852],{"class":114},[79,3102,147],{"class":118},[79,3104,150],{"class":114},[79,3106,147],{"class":118},[79,3108,32],{"class":114},[79,3110,3111],{"class":118},"(msg), handler);\n",[79,3113,3114],{"class":81,"line":122},[79,3115,274],{"class":118},[13,3117,3118,3119,3122,3123,3126],{},"This ",[17,3120,3121],{},"msg"," is destroyed right after ",[17,3124,3125],{},"send()"," returns, but the asynchronous write may not have completed yet.",[13,3128,3129],{},"Correct approach:",[70,3131,3134],{"className":3132,"code":3133,"language":333,"meta":75},[331],"把 msg 做成类成员变量\n或者用 shared_ptr 管理\n或者使用写队列保存待发送数据\n",[17,3135,3133],{"__ignoreMap":75},[38,3137],{},[41,3139,3141,3142,3144],{"id":3140},"example-7-encapsulating-the-io_context-worker-thread-in-a-class","Example 7: Encapsulating the ",[17,3143,19],{}," worker thread in a class",[52,3146,55],{"id":3147},"program-objective-6",[13,3149,3150,3151,3154],{},"In engineering, it is often desired to run Asio in a separate thread.\nThis example creates a minimal ",[17,3152,3153],{},"IoThread"," class:",[868,3156,3157,3162,3170,3176],{},[871,3158,3159,3160,879],{},"Created during construction ",[17,3161,29],{},[871,3163,3164,3167,3168,879],{},[17,3165,3166],{},"start()"," start a thread to execute ",[17,3169,63],{},[871,3171,3172,3175],{},[17,3173,3174],{},"stop()"," Stop thread;",[871,3177,3178,3179,3181],{},"Use ",[17,3180,26],{}," to submit tasks and verify the results.",[52,3183,68],{"id":3184},"full-code-6",[70,3186,3188],{"className":72,"code":3187,"language":74,"meta":75,"style":75},"#include \u003Cboost\u002Fasio.hpp>\n#include \u003Cfunctional>\n#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstring>\n#include \u003Cthread>\n\nclass IoThread\n{\npublic:\n    IoThread()\n        : guard_(boost::asio::make_work_guard(io_))\n    {\n    }\n\n    ~IoThread()\n    {\n        stop();\n    }\n\n    void start()\n    {\n        thread_ = std::thread(std::bind(&IoThread::run, this));\n    }\n\n    void stop()\n    {\n        if (!stopped_)\n        {\n            stopped_ = true;\n            guard_.reset();\n            io_.stop();\n\n            if (thread_.joinable())\n            {\n                thread_.join();\n            }\n        }\n    }\n\n    boost::asio::io_context& io()\n    {\n        return io_;\n    }\n\nprivate:\n    void run()\n    {\n        std::cout \u003C\u003C \"IoThread：io.run() 开始\" \u003C\u003C std::endl;\n        \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n        io_.run();\n        std::cout \u003C\u003C \"IoThread：io.run() 返回\" \u003C\u003C std::endl;\n    }\n\nprivate:\n    \u002F\u002F io_context 是 Asio 的事件循环对象，异步任务需要靠它调度。\n    boost::asio::io_context io_;\n    boost::asio::executor_work_guard\u003Cboost::asio::io_context::executor_type> guard_;\n    std::thread thread_;\n    bool stopped_ = false;\n};\n\nvoid print_task(const std::string& msg)\n{\n    std::cout \u003C\u003C \"执行任务：\" \u003C\u003C msg \u003C\u003C std::endl;\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    IoThread io_thread;\n    io_thread.start();\n\n    \u002F\u002F post 只是把任务放进队列，真正执行要等 io.run()。\n    boost::asio::post(io_thread.io(), std::bind(print_task, std::string(\"A\")));\n    boost::asio::post(io_thread.io(), std::bind(print_task, std::string(\"B\")));\n\n    std::this_thread::sleep_for(std::chrono::seconds(1));\n\n    std::cout \u003C\u003C \"main：准备停止 IoThread\" \u003C\u003C std::endl;\n    io_thread.stop();\n\n    std::cout \u003C\u003C \"main：结束\" \u003C\u003C std::endl;\n\n    return 0;\n}\n",[17,3189,3190,3196,3202,3208,3214,3220,3227,3231,3238,3242,3246,3253,3275,3279,3283,3287,3294,3298,3305,3309,3313,3322,3326,3362,3366,3370,3379,3383,3397,3402,3414,3423,3433,3437,3451,3456,3466,3471,3476,3480,3484,3503,3507,3514,3518,3522,3526,3535,3540,3558,3564,3574,3592,3597,3602,3607,3612,3624,3656,3664,3680,3685,3690,3714,3719,3740,3745,3750,3759,3764,3769,3775,3786,3791,3796,3838,3877,3882,3916,3921,3939,3948,3953,3970,3975,3984],{"__ignoreMap":75},[79,3191,3192,3194],{"class":81,"line":82},[79,3193,86],{"class":85},[79,3195,90],{"class":89},[79,3197,3198,3200],{"class":81,"line":93},[79,3199,86],{"class":85},[79,3201,421],{"class":89},[79,3203,3204,3206],{"class":81,"line":101},[79,3205,86],{"class":85},[79,3207,98],{"class":89},[79,3209,3210,3212],{"class":81,"line":108},[79,3211,86],{"class":85},[79,3213,1025],{"class":89},[79,3215,3216,3218],{"class":81,"line":122},[79,3217,86],{"class":85},[79,3219,434],{"class":89},[79,3221,3222,3224],{"class":81,"line":128},[79,3223,86],{"class":85},[79,3225,3226],{"class":89}," \u003Cthread>\n",[79,3228,3229],{"class":81,"line":135},[79,3230,105],{"emptyLinePlaceholder":104},[79,3232,3233,3235],{"class":81,"line":141},[79,3234,2200],{"class":85},[79,3236,3237],{"class":114}," IoThread\n",[79,3239,3240],{"class":81,"line":156},[79,3241,125],{"class":118},[79,3243,3244],{"class":81,"line":161},[79,3245,2212],{"class":85},[79,3247,3248,3251],{"class":81,"line":185},[79,3249,3250],{"class":114},"    IoThread",[79,3252,119],{"class":118},[79,3254,3255,3257,3260,3262,3264,3266,3268,3270,3272],{"class":81,"line":190},[79,3256,2241],{"class":118},[79,3258,3259],{"class":114},"guard_",[79,3261,449],{"class":118},[79,3263,852],{"class":114},[79,3265,147],{"class":118},[79,3267,150],{"class":114},[79,3269,147],{"class":118},[79,3271,1308],{"class":114},[79,3273,3274],{"class":118},"(io_))\n",[79,3276,3277],{"class":81,"line":196},[79,3278,1147],{"class":118},[79,3280,3281],{"class":81,"line":221},[79,3282,1188],{"class":118},[79,3284,3285],{"class":81,"line":226},[79,3286,105],{"emptyLinePlaceholder":104},[79,3288,3289,3292],{"class":81,"line":253},[79,3290,3291],{"class":114},"    ~IoThread",[79,3293,119],{"class":118},[79,3295,3296],{"class":81,"line":258},[79,3297,1147],{"class":118},[79,3299,3300,3303],{"class":81,"line":271},[79,3301,3302],{"class":114},"        stop",[79,3304,218],{"class":118},[79,3306,3307],{"class":81,"line":562},[79,3308,1188],{"class":118},[79,3310,3311],{"class":81,"line":604},[79,3312,105],{"emptyLinePlaceholder":104},[79,3314,3315,3317,3320],{"class":81,"line":609},[79,3316,2264],{"class":85},[79,3318,3319],{"class":114}," start",[79,3321,119],{"class":118},[79,3323,3324],{"class":81,"line":627},[79,3325,1147],{"class":118},[79,3327,3328,3331,3333,3335,3337,3340,3342,3344,3346,3348,3350,3352,3354,3357,3360],{"class":81,"line":663},[79,3329,3330],{"class":118},"        thread_ ",[79,3332,209],{"class":85},[79,3334,179],{"class":114},[79,3336,147],{"class":118},[79,3338,3339],{"class":114},"thread",[79,3341,449],{"class":118},[79,3343,579],{"class":114},[79,3345,147],{"class":118},[79,3347,584],{"class":114},[79,3349,449],{"class":118},[79,3351,462],{"class":85},[79,3353,3153],{"class":114},[79,3355,3356],{"class":118},"::run, ",[79,3358,3359],{"class":264},"this",[79,3361,1357],{"class":118},[79,3363,3364],{"class":81,"line":668},[79,3365,1188],{"class":118},[79,3367,3368],{"class":81,"line":685},[79,3369,105],{"emptyLinePlaceholder":104},[79,3371,3372,3374,3377],{"class":81,"line":690},[79,3373,2264],{"class":85},[79,3375,3376],{"class":114}," stop",[79,3378,119],{"class":118},[79,3380,3381],{"class":81,"line":695},[79,3382,1147],{"class":118},[79,3384,3385,3388,3391,3394],{"class":81,"line":714},[79,3386,3387],{"class":85},"        if",[79,3389,3390],{"class":118}," (",[79,3392,3393],{"class":85},"!",[79,3395,3396],{"class":118},"stopped_)\n",[79,3398,3399],{"class":81,"line":719},[79,3400,3401],{"class":118},"        {\n",[79,3403,3404,3407,3409,3412],{"class":81,"line":745},[79,3405,3406],{"class":118},"            stopped_ ",[79,3408,209],{"class":85},[79,3410,3411],{"class":264}," true",[79,3413,268],{"class":118},[79,3415,3416,3419,3421],{"class":81,"line":750},[79,3417,3418],{"class":118},"            guard_.",[79,3420,1217],{"class":114},[79,3422,218],{"class":118},[79,3424,3425,3428,3431],{"class":81,"line":759},[79,3426,3427],{"class":118},"            io_.",[79,3429,3430],{"class":114},"stop",[79,3432,218],{"class":118},[79,3434,3435],{"class":81,"line":1323},[79,3436,105],{"emptyLinePlaceholder":104},[79,3438,3439,3442,3445,3448],{"class":81,"line":1360},[79,3440,3441],{"class":85},"            if",[79,3443,3444],{"class":118}," (thread_.",[79,3446,3447],{"class":114},"joinable",[79,3449,3450],{"class":118},"())\n",[79,3452,3453],{"class":81,"line":1365},[79,3454,3455],{"class":118},"            {\n",[79,3457,3458,3461,3464],{"class":81,"line":1371},[79,3459,3460],{"class":118},"                thread_.",[79,3462,3463],{"class":114},"join",[79,3465,218],{"class":118},[79,3467,3468],{"class":81,"line":1391},[79,3469,3470],{"class":118},"            }\n",[79,3472,3473],{"class":81,"line":1405},[79,3474,3475],{"class":118},"        }\n",[79,3477,3478],{"class":81,"line":1411},[79,3479,1188],{"class":118},[79,3481,3482],{"class":81,"line":1416},[79,3483,105],{"emptyLinePlaceholder":104},[79,3485,3486,3488,3490,3492,3494,3496,3498,3501],{"class":81,"line":1434},[79,3487,144],{"class":114},[79,3489,147],{"class":118},[79,3491,150],{"class":114},[79,3493,147],{"class":118},[79,3495,19],{"class":114},[79,3497,462],{"class":85},[79,3499,3500],{"class":114}," io",[79,3502,119],{"class":118},[79,3504,3505],{"class":81,"line":1439},[79,3506,1147],{"class":118},[79,3508,3509,3511],{"class":81,"line":1458},[79,3510,1181],{"class":85},[79,3512,3513],{"class":118}," io_;\n",[79,3515,3516],{"class":81,"line":1463},[79,3517,1188],{"class":118},[79,3519,3520],{"class":81,"line":1488},[79,3521,105],{"emptyLinePlaceholder":104},[79,3523,3524],{"class":81,"line":1493},[79,3525,2335],{"class":85},[79,3527,3528,3530,3533],{"class":81,"line":1502},[79,3529,2264],{"class":85},[79,3531,3532],{"class":114}," run",[79,3534,119],{"class":118},[79,3536,3538],{"class":81,"line":3537},48,[79,3539,1147],{"class":118},[79,3541,3543,3545,3547,3549,3552,3554,3556],{"class":81,"line":3542},49,[79,3544,1152],{"class":114},[79,3546,167],{"class":118},[79,3548,170],{"class":85},[79,3550,3551],{"class":89}," \"IoThread：io.run() 开始\"",[79,3553,176],{"class":85},[79,3555,179],{"class":114},[79,3557,182],{"class":118},[79,3559,3561],{"class":81,"line":3560},50,[79,3562,3563],{"class":131},"        \u002F\u002F 启动事件循环，前面注册的异步任务会在这里被调度执行。\n",[79,3565,3567,3570,3572],{"class":81,"line":3566},51,[79,3568,3569],{"class":118},"        io_.",[79,3571,215],{"class":114},[79,3573,218],{"class":118},[79,3575,3577,3579,3581,3583,3586,3588,3590],{"class":81,"line":3576},52,[79,3578,1152],{"class":114},[79,3580,167],{"class":118},[79,3582,170],{"class":85},[79,3584,3585],{"class":89}," \"IoThread：io.run() 返回\"",[79,3587,176],{"class":85},[79,3589,179],{"class":114},[79,3591,182],{"class":118},[79,3593,3595],{"class":81,"line":3594},53,[79,3596,1188],{"class":118},[79,3598,3600],{"class":81,"line":3599},54,[79,3601,105],{"emptyLinePlaceholder":104},[79,3603,3605],{"class":81,"line":3604},55,[79,3606,2335],{"class":85},[79,3608,3610],{"class":81,"line":3609},56,[79,3611,138],{"class":131},[79,3613,3615,3617,3619,3621],{"class":81,"line":3614},57,[79,3616,144],{"class":114},[79,3618,147],{"class":118},[79,3620,150],{"class":114},[79,3622,3623],{"class":118},"::io_context io_;\n",[79,3625,3627,3629,3631,3633,3636,3638,3640,3642,3644,3646,3648,3651,3653],{"class":81,"line":3626},58,[79,3628,144],{"class":114},[79,3630,147],{"class":118},[79,3632,150],{"class":114},[79,3634,3635],{"class":118},"::executor_work_guard",[79,3637,1054],{"class":85},[79,3639,852],{"class":114},[79,3641,147],{"class":118},[79,3643,150],{"class":114},[79,3645,147],{"class":118},[79,3647,19],{"class":114},[79,3649,3650],{"class":118},"::executor_type",[79,3652,1275],{"class":85},[79,3654,3655],{"class":118}," guard_;\n",[79,3657,3659,3661],{"class":81,"line":3658},59,[79,3660,164],{"class":114},[79,3662,3663],{"class":118},"::thread thread_;\n",[79,3665,3667,3670,3673,3675,3678],{"class":81,"line":3666},60,[79,3668,3669],{"class":85},"    bool",[79,3671,3672],{"class":118}," stopped_ ",[79,3674,209],{"class":85},[79,3676,3677],{"class":264}," false",[79,3679,268],{"class":118},[79,3681,3683],{"class":81,"line":3682},61,[79,3684,2347],{"class":118},[79,3686,3688],{"class":81,"line":3687},62,[79,3689,105],{"emptyLinePlaceholder":104},[79,3691,3693,3695,3698,3700,3702,3704,3706,3708,3710,3712],{"class":81,"line":3692},63,[79,3694,443],{"class":85},[79,3696,3697],{"class":114}," print_task",[79,3699,449],{"class":118},[79,3701,452],{"class":85},[79,3703,179],{"class":114},[79,3705,147],{"class":118},[79,3707,459],{"class":114},[79,3709,462],{"class":85},[79,3711,466],{"class":465},[79,3713,469],{"class":118},[79,3715,3717],{"class":81,"line":3716},64,[79,3718,125],{"class":118},[79,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738],{"class":81,"line":3721},65,[79,3723,164],{"class":114},[79,3725,167],{"class":118},[79,3727,170],{"class":85},[79,3729,484],{"class":89},[79,3731,176],{"class":85},[79,3733,489],{"class":118},[79,3735,170],{"class":85},[79,3737,179],{"class":114},[79,3739,182],{"class":118},[79,3741,3743],{"class":81,"line":3742},66,[79,3744,274],{"class":118},[79,3746,3748],{"class":81,"line":3747},67,[79,3749,105],{"emptyLinePlaceholder":104},[79,3751,3753,3755,3757],{"class":81,"line":3752},68,[79,3754,111],{"class":85},[79,3756,115],{"class":114},[79,3758,119],{"class":118},[79,3760,3762],{"class":81,"line":3761},69,[79,3763,125],{"class":118},[79,3765,3767],{"class":81,"line":3766},70,[79,3768,132],{"class":131},[79,3770,3772],{"class":81,"line":3771},71,[79,3773,3774],{"class":118},"    IoThread io_thread;\n",[79,3776,3778,3781,3784],{"class":81,"line":3777},72,[79,3779,3780],{"class":118},"    io_thread.",[79,3782,3783],{"class":114},"start",[79,3785,218],{"class":118},[79,3787,3789],{"class":81,"line":3788},73,[79,3790,105],{"emptyLinePlaceholder":104},[79,3792,3794],{"class":81,"line":3793},74,[79,3795,559],{"class":131},[79,3797,3799,3801,3803,3805,3807,3809,3812,3814,3817,3819,3821,3823,3826,3828,3830,3832,3834,3836],{"class":81,"line":3798},75,[79,3800,144],{"class":114},[79,3802,147],{"class":118},[79,3804,150],{"class":114},[79,3806,147],{"class":118},[79,3808,573],{"class":114},[79,3810,3811],{"class":118},"(io_thread.",[79,3813,875],{"class":114},[79,3815,3816],{"class":118},"(), ",[79,3818,579],{"class":114},[79,3820,147],{"class":118},[79,3822,584],{"class":114},[79,3824,3825],{"class":118},"(print_task, ",[79,3827,579],{"class":114},[79,3829,147],{"class":118},[79,3831,459],{"class":114},[79,3833,449],{"class":118},[79,3835,598],{"class":89},[79,3837,601],{"class":118},[79,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3875],{"class":81,"line":3840},76,[79,3842,144],{"class":114},[79,3844,147],{"class":118},[79,3846,150],{"class":114},[79,3848,147],{"class":118},[79,3850,573],{"class":114},[79,3852,3811],{"class":118},[79,3854,875],{"class":114},[79,3856,3816],{"class":118},[79,3858,579],{"class":114},[79,3860,147],{"class":118},[79,3862,584],{"class":114},[79,3864,3825],{"class":118},[79,3866,579],{"class":114},[79,3868,147],{"class":118},[79,3870,459],{"class":114},[79,3872,449],{"class":118},[79,3874,658],{"class":89},[79,3876,601],{"class":118},[79,3878,3880],{"class":81,"line":3879},77,[79,3881,105],{"emptyLinePlaceholder":104},[79,3883,3885,3887,3889,3892,3894,3897,3899,3901,3903,3905,3907,3909,3911,3914],{"class":81,"line":3884},78,[79,3886,164],{"class":114},[79,3888,147],{"class":118},[79,3890,3891],{"class":114},"this_thread",[79,3893,147],{"class":118},[79,3895,3896],{"class":114},"sleep_for",[79,3898,449],{"class":118},[79,3900,579],{"class":114},[79,3902,147],{"class":118},[79,3904,1344],{"class":114},[79,3906,147],{"class":118},[79,3908,1349],{"class":114},[79,3910,449],{"class":118},[79,3912,3913],{"class":264},"1",[79,3915,1357],{"class":118},[79,3917,3919],{"class":81,"line":3918},79,[79,3920,105],{"emptyLinePlaceholder":104},[79,3922,3924,3926,3928,3930,3933,3935,3937],{"class":81,"line":3923},80,[79,3925,164],{"class":114},[79,3927,167],{"class":118},[79,3929,170],{"class":85},[79,3931,3932],{"class":89}," \"main：准备停止 IoThread\"",[79,3934,176],{"class":85},[79,3936,179],{"class":114},[79,3938,182],{"class":118},[79,3940,3942,3944,3946],{"class":81,"line":3941},81,[79,3943,3780],{"class":118},[79,3945,3430],{"class":114},[79,3947,218],{"class":118},[79,3949,3951],{"class":81,"line":3950},82,[79,3952,105],{"emptyLinePlaceholder":104},[79,3954,3956,3958,3960,3962,3964,3966,3968],{"class":81,"line":3955},83,[79,3957,164],{"class":114},[79,3959,167],{"class":118},[79,3961,170],{"class":85},[79,3963,1951],{"class":89},[79,3965,176],{"class":85},[79,3967,179],{"class":114},[79,3969,182],{"class":118},[79,3971,3973],{"class":81,"line":3972},84,[79,3974,105],{"emptyLinePlaceholder":104},[79,3976,3978,3980,3982],{"class":81,"line":3977},85,[79,3979,261],{"class":85},[79,3981,265],{"class":264},[79,3983,268],{"class":118},[79,3985,3987],{"class":81,"line":3986},86,[79,3988,274],{"class":118},[13,3990,3991,281],{},[278,3992,280],{},[52,3994,285],{"id":3995},"compile-and-run-6",[70,3997,3999],{"className":288,"code":3998,"language":290,"meta":75,"style":75},"g++ demo7_iothread.cpp -o demo7_iothread -std=c++17 -lboost_system -pthread\n.\u002Fdemo7_iothread\n",[17,4000,4001,4019],{"__ignoreMap":75},[79,4002,4003,4005,4008,4010,4013,4015,4017],{"class":81,"line":82},[79,4004,297],{"class":114},[79,4006,4007],{"class":89}," demo7_iothread.cpp",[79,4009,303],{"class":264},[79,4011,4012],{"class":89}," demo7_iothread",[79,4014,309],{"class":264},[79,4016,312],{"class":264},[79,4018,315],{"class":264},[79,4020,4021],{"class":81,"line":93},[79,4022,4023],{"class":114},".\u002Fdemo7_iothread\n",[52,4025,324],{"id":4026},"execution-output-and-chronological-order-3",[13,4028,4029],{},"After the program starts, the worker thread begins running:",[70,4031,4034],{"className":4032,"code":4033,"language":333,"meta":75},[331],"IoThread：io.run() 开始\n执行任务：A\n执行任务：B\n",[17,4035,4033],{"__ignoreMap":75},[13,4037,4038],{},"After about 1 second, the main thread stops it:",[70,4040,4043],{"className":4041,"code":4042,"language":333,"meta":75},[331],"main：准备停止 IoThread\nIoThread：io.run() 返回\nmain：结束\n",[17,4044,4042],{"__ignoreMap":75},[13,4046,1562],{},[70,4048,4051],{"className":4049,"code":4050,"language":333,"meta":75},[331],"IoThread：io.run() 开始\n执行任务：A\n执行任务：B\nmain：准备停止 IoThread\nIoThread：io.run() 返回\nmain：结束\n",[17,4052,4050],{"__ignoreMap":75},[52,4054,339],{"id":4055},"points-to-note-for-this-example-6",[13,4057,4058],{},"This class is the prototype for encapsulating serial port, TCP, and UDP communication threads in the future.",[13,4060,4061],{},"However, note:",[70,4063,4065],{"className":72,"code":4064,"language":74,"meta":75,"style":75},"io_.stop();\n",[17,4066,4067],{"__ignoreMap":75},[79,4068,4069,4072,4074],{"class":81,"line":82},[79,4070,4071],{"class":118},"io_.",[79,4073,3430],{"class":114},[79,4075,218],{"class":118},[13,4077,4078,4079,4081],{},"will cause ",[17,4080,19],{}," to stop as soon as possible, and unfinished asynchronous tasks may not complete normally.",[13,4083,4084],{},"A more detailed approach in the project is:",[70,4086,4089],{"className":4087,"code":4088,"language":333,"meta":75},[331],"先 cancel socket \u002F timer \u002F serial_port\n再 reset work_guard\n最后等待 run() 返回\n",[17,4090,4088],{"__ignoreMap":75},[38,4092],{},[41,4094,4096],{"id":4095},"section-summary","Section Summary",[868,4098,4099,4104,4112,4120,4125,4130],{},[871,4100,4101,4102,50],{},"When there is no task, ",[17,4103,63],{},[871,4105,4106,4108,4109,4111],{},[17,4107,26],{}," can submit ordinary functions to ",[17,4110,19],{}," for execution.",[871,4113,4114,4116,4117,4119],{},[17,4115,29],{}," can prevent ",[17,4118,63],{}," from exiting because there are no tasks to perform.",[871,4121,4122,4124],{},[17,4123,35],{}," can bind ordinary functions, as well as member functions.",[871,4126,4127,4129],{},[17,4128,3038],{}," is usually just a memory view and is not responsible for extending the data lifecycle.",[871,4131,4132],{},"The most important aspects in asynchronous engineering are object lifecycle and buffer lifecycle.",[4134,4135,4136],"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 .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);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":75,"searchDepth":93,"depth":93,"links":4138},[4139,4149,4161,4171,4179,4191,4199,4207],{"id":43,"depth":93,"text":4140,"children":4141},"Example 1: When io_context has no tasks, run() returns immediately.",[4142,4143,4144,4145,4146,4147],{"id":54,"depth":101,"text":55},{"id":67,"depth":101,"text":68},{"id":284,"depth":101,"text":285},{"id":323,"depth":101,"text":324},{"id":338,"depth":101,"text":339},{"id":356,"depth":101,"text":4148},"io.run() return value",{"id":378,"depth":93,"text":4150,"children":4151},"Example 2: Submitting tasks using post() in a normal main()",[4152,4153,4154,4155,4156,4157,4159],{"id":388,"depth":101,"text":55},{"id":403,"depth":101,"text":68},{"id":768,"depth":101,"text":285},{"id":799,"depth":101,"text":324},{"id":811,"depth":101,"text":339},{"id":839,"depth":101,"text":4158},"post() Function Description",{"id":891,"depth":101,"text":4160},"std::bind Description",{"id":947,"depth":93,"text":4162,"children":4163},"Example 3: work_guard prevents io.run() from immediately exiting due to lack of tasks.",[4164,4165,4166,4167,4168,4169],{"id":957,"depth":101,"text":55},{"id":981,"depth":101,"text":68},{"id":1511,"depth":101,"text":285},{"id":1542,"depth":101,"text":324},{"id":1571,"depth":101,"text":339},{"id":1592,"depth":101,"text":4170},"make_work_guard() Description",{"id":1636,"depth":93,"text":4172,"children":4173},"Example 4: Ordinary function parameter binding of std::bind",[4174,4175,4176,4177,4178],{"id":1642,"depth":101,"text":55},{"id":1655,"depth":101,"text":68},{"id":1980,"depth":101,"text":285},{"id":2008,"depth":101,"text":2009},{"id":2018,"depth":101,"text":339},{"id":2136,"depth":93,"text":4180,"children":4181},"Example 5: Class member function using std::bind",[4182,4183,4184,4185,4186,4187,4189],{"id":2142,"depth":101,"text":55},{"id":2168,"depth":101,"text":68},{"id":2563,"depth":101,"text":285},{"id":2590,"depth":101,"text":2009},{"id":2599,"depth":101,"text":339},{"id":2654,"depth":101,"text":4188},"What is &Robot::print_pose?",{"id":2668,"depth":101,"text":4190},"What is &robot?",{"id":2688,"depth":93,"text":4192,"children":4193},"Example 6: Basic Usage of buffer",[4194,4195,4196,4197,4198],{"id":2694,"depth":101,"text":55},{"id":2723,"depth":101,"text":68},{"id":2993,"depth":101,"text":285},{"id":3024,"depth":101,"text":2009},{"id":3033,"depth":101,"text":339},{"id":3140,"depth":93,"text":4200,"children":4201},"Example 7: Encapsulating the io_context worker thread in a class",[4202,4203,4204,4205,4206],{"id":3147,"depth":101,"text":55},{"id":3184,"depth":101,"text":68},{"id":3995,"depth":101,"text":285},{"id":4026,"depth":101,"text":324},{"id":4055,"depth":101,"text":339},{"id":4095,"depth":93,"text":4096},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","2100-0100-0200","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","en-us:2023-10-05-cplusplus-jiao-xue","\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础",false,null,"en-US","en-us",{},{"title":5,"description":75},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Dsbpn2DkiYcpdfgFyGcWpGNLoQIdGSFiZ79dctjRmXI",[4227,4233,4238,4243,4248,4253,4258,4263,4268,4273,4278,4283,4288,4293,4298,4303,4308,4313,4318,4323,4328,4333,4338,4343,4348,4353,4358,4363,4368,4373,4378,4383,4388,4393,4398,4403,4408,4413,4418,4423,4427,4432,4437,4442,4447,4452,4457,4462,4467,4472,4476,4481,4486,4491,4496,4501,4506,4511,4516,4521,4526,4531,4536,4541,4546,4547,4552,4557,4562,4567,4572,4577,4582,4587,4592,4597,4602,4607,4612,4617,4622,4627],{"path":4228,"stem":4229,"title":4230,"date":4210,"chapterOrder":4231,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++ Development Environment Setup and Testing","0100",0,{"path":4234,"stem":4235,"title":4236,"date":4210,"chapterOrder":4237,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++ Basics","0200",{"path":4239,"stem":4240,"title":4241,"date":4210,"chapterOrder":4242,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","Data Types and Data Storage","0300",{"path":4244,"stem":4245,"title":4246,"date":4210,"chapterOrder":4247,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","Input and Output","0400",{"path":4249,"stem":4250,"title":4251,"date":4210,"chapterOrder":4252,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","operator","0500",{"path":4254,"stem":4255,"title":4256,"date":4210,"chapterOrder":4257,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","program flow structure","0600",{"path":4259,"stem":4260,"title":4261,"date":4210,"chapterOrder":4262,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":4264,"stem":4265,"title":4266,"date":4210,"chapterOrder":4267,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","Functions and Header Files","0800",{"path":4269,"stem":4270,"title":4271,"date":4210,"chapterOrder":4272,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":4274,"stem":4275,"title":4276,"date":4210,"chapterOrder":4277,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","Structures and Unions","1000",{"path":4279,"stem":4280,"title":4281,"date":4210,"chapterOrder":4282,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","Memory Partitioning and Lifecycle","1100",{"path":4284,"stem":4285,"title":4286,"date":4210,"chapterOrder":4287,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":4289,"stem":4290,"title":4291,"date":4210,"chapterOrder":4292,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","Advanced Functions and Namespaces","1300",{"path":4294,"stem":4295,"title":4296,"date":4210,"chapterOrder":4297,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","encapsulation","1400-0100",{"path":4299,"stem":4300,"title":4301,"date":4210,"chapterOrder":4302,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","Object initialization and cleanup","1400-0200",{"path":4304,"stem":4305,"title":4306,"date":4210,"chapterOrder":4307,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","Object Model and the `this` Pointer","1400-0300",{"path":4309,"stem":4310,"title":4311,"date":4210,"chapterOrder":4312,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","Friends and operator overloading","1400-0400",{"path":4314,"stem":4315,"title":4316,"date":4210,"chapterOrder":4317,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","inheritance","1400-0500",{"path":4319,"stem":4320,"title":4321,"date":4210,"chapterOrder":4322,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","polymorphism","1400-0600",{"path":4324,"stem":4325,"title":4326,"date":4210,"chapterOrder":4327,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","Classes and Objects","1400",{"path":4329,"stem":4330,"title":4331,"date":4210,"chapterOrder":4332,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","File operations","1500",{"path":4334,"stem":4335,"title":4336,"date":4210,"chapterOrder":4337,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理","1600",{"path":4339,"stem":4340,"title":4341,"date":4210,"chapterOrder":4342,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":4344,"stem":4345,"title":4346,"date":4210,"chapterOrder":4347,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","Introduction to STL","1800-0100",{"path":4349,"stem":4350,"title":4351,"date":4210,"chapterOrder":4352,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":4354,"stem":4355,"title":4356,"date":4210,"chapterOrder":4357,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string container","1800-0300",{"path":4359,"stem":4360,"title":4361,"date":4210,"chapterOrder":4362,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":4364,"stem":4365,"title":4366,"date":4210,"chapterOrder":4367,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":4369,"stem":4370,"title":4371,"date":4210,"chapterOrder":4372,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":4374,"stem":4375,"title":4376,"date":4210,"chapterOrder":4377,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue container","1800-0700",{"path":4379,"stem":4380,"title":4381,"date":4210,"chapterOrder":4382,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":4384,"stem":4385,"title":4386,"date":4210,"chapterOrder":4387,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":4389,"stem":4390,"title":4391,"date":4210,"chapterOrder":4392,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":4394,"stem":4395,"title":4396,"date":4210,"chapterOrder":4397,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","Function objects and predicates","1800-1100",{"path":4399,"stem":4400,"title":4401,"date":4210,"chapterOrder":4402,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","Common algorithms","1800-1200",{"path":4404,"stem":4405,"title":4406,"date":4210,"chapterOrder":4407,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","Level up your programming with STL.","1800",{"path":4409,"stem":4410,"title":4411,"date":4210,"chapterOrder":4412,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":4414,"stem":4415,"title":4416,"date":4210,"chapterOrder":4417,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":4419,"stem":4420,"title":4421,"date":4210,"chapterOrder":4422,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":4424,"stem":4425,"title":1034,"date":4210,"chapterOrder":4426,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":4428,"stem":4429,"title":4430,"date":4210,"chapterOrder":4431,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":4433,"stem":4434,"title":4435,"date":4210,"chapterOrder":4436,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","range-based for loop","2000-0500",{"path":4438,"stem":4439,"title":4440,"date":4210,"chapterOrder":4441,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","structured binding","2000-0600",{"path":4443,"stem":4444,"title":4445,"date":4210,"chapterOrder":4446,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":4448,"stem":4449,"title":4450,"date":4210,"chapterOrder":4451,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":4453,"stem":4454,"title":4455,"date":4210,"chapterOrder":4456,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","Smart pointer","2000-0900",{"path":4458,"stem":4459,"title":4460,"date":4210,"chapterOrder":4461,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","Rvalue references and move semantics","2000-1000",{"path":4463,"stem":4464,"title":4465,"date":4210,"chapterOrder":4466,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda expression","2000-1100",{"path":4468,"stem":4469,"title":4470,"date":4210,"chapterOrder":4471,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":4473,"stem":4474,"title":35,"date":4210,"chapterOrder":4475,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","2000-1300",{"path":4477,"stem":4478,"title":4479,"date":4210,"chapterOrder":4480,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":4482,"stem":4483,"title":4484,"date":4210,"chapterOrder":4485,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":4487,"stem":4488,"title":4489,"date":4210,"chapterOrder":4490,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":4492,"stem":4493,"title":4494,"date":4210,"chapterOrder":4495,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":4497,"stem":4498,"title":4499,"date":4210,"chapterOrder":4500,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":4502,"stem":4503,"title":4504,"date":4210,"chapterOrder":4505,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread and join","2000-1900-0100",{"path":4507,"stem":4508,"title":4509,"date":4210,"chapterOrder":4510,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":4512,"stem":4513,"title":4514,"date":4210,"chapterOrder":4515,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":4517,"stem":4518,"title":4519,"date":4210,"chapterOrder":4520,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":4522,"stem":4523,"title":4524,"date":4210,"chapterOrder":4525,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","Concurrent programming","2000-1900",{"path":4527,"stem":4528,"title":4529,"date":4210,"chapterOrder":4530,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":4532,"stem":4533,"title":4534,"date":4210,"chapterOrder":4535,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","Modules Introduction","2000-2100",{"path":4537,"stem":4538,"title":4539,"date":4210,"chapterOrder":4540,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","Modern C++","2000",{"path":4542,"stem":4543,"title":4544,"date":4210,"chapterOrder":4545,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","Timers and Asynchronous I\u002FO","2100-0100-0100",{"path":4208,"stem":4224,"title":5,"date":4210,"chapterOrder":4209,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},{"path":4548,"stem":4549,"title":4550,"date":4210,"chapterOrder":4551,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","serial communication","2100-0100-0300",{"path":4553,"stem":4554,"title":4555,"date":4210,"chapterOrder":4556,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP communication","2100-0100-0400",{"path":4558,"stem":4559,"title":4560,"date":4210,"chapterOrder":4561,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP communication","2100-0100-0500",{"path":4563,"stem":4564,"title":4565,"date":4210,"chapterOrder":4566,"chapterDepth":93,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","Robot Engineering Approach and ROS2 Integration","2100-0100-0600",{"path":4568,"stem":4569,"title":4570,"date":4210,"chapterOrder":4571,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio asynchronous IO library","2100-0100",{"path":4573,"stem":4574,"title":4575,"date":4210,"chapterOrder":4576,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen linear algebra library","2100-0200",{"path":4578,"stem":4579,"title":4580,"date":4210,"chapterOrder":4581,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV Computer Vision Library","2100-0300",{"path":4583,"stem":4584,"title":4585,"date":4210,"chapterOrder":4586,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL Point Cloud Library","2100-0400",{"path":4588,"stem":4589,"title":4590,"date":4210,"chapterOrder":4591,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus Lie group and Lie algebra library","2100-0500",{"path":4593,"stem":4594,"title":4595,"date":4210,"chapterOrder":4596,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","Learning Common Libraries","2100",{"path":4598,"stem":4599,"title":4600,"date":4210,"chapterOrder":4601,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets and Build Installation","2200-0100",{"path":4603,"stem":4604,"title":4605,"date":4210,"chapterOrder":4606,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","Top-level CMake and Public Compilation Options","2200-0200",{"path":4608,"stem":4609,"title":4610,"date":4210,"chapterOrder":4611,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","Detailed CMake Explanation for src and lib Modules","2200-0300",{"path":4613,"stem":4614,"title":4615,"date":4210,"chapterOrder":4616,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","How to write third-party library dependencies","2200-0400",{"path":4618,"stem":4619,"title":4620,"date":4210,"chapterOrder":4621,"chapterDepth":82,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","Template Extensions and FAQ","2200-0500",{"path":4623,"stem":4624,"title":4625,"date":4210,"chapterOrder":4626,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":4217},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake Project Template","2200",{"path":4213,"stem":4628,"title":4629,"date":4210,"chapterOrder":4218,"chapterDepth":4232,"docKey":4212,"docRoot":4213,"docTitle":4214,"isWikiDoc":104,"isWikiIndex":104},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":4631},[4632,4633,4636,4639,4642],{"path":4208,"localeSlug":4220,"i18nKey":4216},{"path":4634,"localeSlug":4635,"i18nKey":4216},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","zh-hant",{"path":4637,"localeSlug":4638,"i18nKey":4216},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","zh-hk",{"path":4640,"localeSlug":4641,"i18nKey":4216},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","zh-tw",{"path":4643,"localeSlug":4644,"i18nKey":4216},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","zh-cn",[4208,4223,4634,4223,4637,4223,4640,4223,4643,4223],1784646870690]