锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浜嬫儏鐨勮搗鍥犳槸錛屾兂鎵句釜璺?Windows 鍜?Mac 鐨勬瀯寤烘柟妗堛傜涓鑰冭檻鑷劧鏄?CMake錛屾瘯绔熷熀鏈笂鏄簨瀹炴爣鍑嗕簡銆?/p>
浣嗘槸鐮旂┒浜嗕竴涓?Modern CMake錛屼篃灝辨槸浠?target 涓烘牳蹇冪殑鐞嗗康銆備絾鍙戠幇鐪嬩簡濂藉嚑澶╂枃妗o紝涔熸姌鑵懼嚭浜嗗彲鐢ㄧ殑涓滆タ錛屼絾浠嶇劧鏄病姊崇悊娓呮浠涔堢悊蹇點佸師鐞嗐傜劧鍚?CMake 鏈韓璇硶灝卞緢澶嶆潅錛屽啀鍔犱笂鎼?target 涓濂楁蹇碉紝瑕佺粰 target 璁劇疆鍚勭灞炴т箣綾葷殑錛屾湁鐐瑰己琛?OOP 鐨勬劅瑙夆︹︿絾鍏跺疄鎴戜滑鍙槸闇瑕佷竴涓?include_dir 鍜?lib_dir 鑰屽凡錛屽叾浠栭兘鏄誕浜憕 浣嗗鏋滈鍥炲埌浼犵粺妯″紡錛屼笉鐢?Modern 姒傚康鍛紝濂藉儚鍙互灝嗗氨錛屼絾絎竴涓嶅幓鐢ㄤ竴涓伐鍏風殑鏈鏂版ā寮忥紝濂藉儚鏈夌偣涓嶄笂榪涚殑鎰熻錛坧ython 2 闄ゅ錛夛紱絎簩錛孋Make 鐨勪袱澶х棝鐐光斺旇娉曠壒绔嬬嫭琛屻佹枃妗f櫐娑╅毦鎳傗斺旇繕鏄浜烘湁鐐逛笉鐖姐?/p>
閭h煩鍑烘潵鐪嬪埆鐨勯夋嫨鍛紵鐩墠鐩稿鎴愮啛鐨勪篃鍙湁 Google 鐨?gn+ninja 鏂規浜嗐俫n 榪欏涓滆タ鍦?Chromium 閲屾槸瀹屽叏閰嶇疆濂界殑錛岀敤璧鋒潵榪樼畻欏烘墜錛屼絾瑕佹槸鐙珛鎷垮嚭鏉ュ憿錛屽氨娌¢偅涔堜究瀹滀簡銆傚叧閿槸瀹冪殑 toolchain 鏄鑷繁瀹氫箟鐨勩?/p>
涔嬪墠榪樺湪鍏徃鎼炲鎴風鐨勬椂鍊欙紝澶у灝變粠 Chromium 閲岄潰鎶?build銆乥uild_overrides 絳夌瓑涓滆タ鍏ㄩ儴鎷峰嚭鏉ワ紝濂藉浼欙紝鍑犵櫨 MB 鐢氳嚦涓?G銆備絾鏄叕鍙擱噷鍢涳紝娌′漢綆″共涓嶅共鍑錛屾庝箞蹇庝箞鏉ャ傚悗鏉ュ張鐪嬪埌 Google 鑷鐨?Crashpad 閲岄潰涔熺敤浜嗚繖濂楁瀯寤猴紝浣嗗伐鍏烽摼琚畝鍖栦簡涓涓嬶紝鍙?mini_chromium銆傝繖涓瘮 Chromium 閲岀殑灝忓浜嗭紝鏄彲浠ユ嬁榪囨潵鐩存帴鐢ㄧ殑錛岀己灝戜竴浜涢厤緗彲浠ヨ嚜宸卞姞銆備絾鏄憿錛屽儚鎴戜滑榪欑媧佺櫀錛屼粛鐒舵槸鍙椾笉楦熺殑銆傛墍浠ュ憿錛屾垜浠騫插共鍑鍑鐨勫緩绔嬩竴濂楀伐鍏烽摼銆?/p>
棣栧厛錛屾垜浠槑紜畾浣嶃俫n 鍜?ninja 閮芥槸寮鍙戞満涓婇渶瑕侀瑁呯殑錛屼笉鏄蔣浠舵彁渚涚殑銆侰hromium 鐨勬悶娉曟槸鑷繁鎻愪緵錛実n 鐨勬枃妗d篃璇磋寮鍙戣呮彁渚涘伐鍏楓備絾榪欏鎬濊礬璺熶紶緇熺殑鐞嗗康鏄啿紿佺殑銆傚悓鏃訛紝鑷繁瀹夎宸ュ叿鎴愭湰鏄瘮杈冧綆鐨勶細 鑷繁涓嬭澆鐨勮緗埌 PATH錛屾祴璇? 甯屾湜鍋氬埌鎻愪緵涓涓?git repo錛屼嬌鐢ㄨ?clone 鍒拌嚜宸遍」鐩殑 build 鐩綍錛岀劧鍚庝嬌鐢ㄨ呭彧瑕佸湪 .gn 鏂囦歡閲岄厤緗?/p>
灝卞彲浠ヤ嬌鐢ㄦ垜浠彁渚涚殑宸ュ叿閾撅紝鍦?PC 涓夌榪涜鏋勫緩銆?/p>
浣跨敤鑰呯殑鍞竴璐熸媴灝辨槸緙栧啓鑷繁鐨?BUILD.gn 棣栧厛鎴戜滑鐪?gn 鐨勬枃妗o紝浠ュ強瀹冪殑渚嬬▼ simple_build 閲岀殑宸ュ叿閾鵑厤緗細 https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 榪欎釜鏄彲浠ョ洿鎺ョ敤鐨勶紝鍙笉榪囧彧鏈?linux 绔紙褰撶劧 mac 涔熻兘鐢級銆傛垜浠啀緇撳悎 chrome 閲岀殑宸ュ叿閾鵑厤緗紝榪涜涓浜涘畬鍠勩?/p>
棣栧厛鎴戜滑浜嗚В gn 浣撶郴闇瑕佺殑鏈灝忛厤緗槸浠涔堛?/p>
絎竴錛屽畠闇瑕佸湪鏍圭洰褰曞啓涓涓?.gn 鏂囦歡錛屽湪閲岄潰瀹氫箟 buildconfig錛屾寚鍒板彟涓涓枃浠訛紝涓鑸槸 絎簩銆丅UILDCONFIG.gn 閲岄潰闇瑕佽緗粯璁ゅ伐鍏烽摼錛屼篃灝辨槸鍐欎竴琛?/p>
絎笁銆佸畾涔夊伐鍏烽摼錛屽涓婁緥鐨?//build/toolchain:gcc銆?/p>
闇瑕佸湪 build/toolchain 涓嬪緩绔?BUILD.gn 鏂囦歡錛屽唴瀹規槸 鏈鍚庡湪 toolchain 閲屽畾涔夊悇縐?tool銆?/p>
榪欓儴鍒嗘枃妗e湪榪欓噷錛歨ttps://gn.googlesource.com/gn/+/main/docs/reference.md#func_tool 綆鍗曞榪頒竴涓嬶紝鍙瀹氫箟鐨勫伐鍏鋒湁錛?/p>
錛堝叾浠栫殑灝卞厛涓嶇湅浜嗭級 鎴戜滑鏉ョ湅涓涓?https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 鐨勪竴浜涘叧閿厤緗細 鍙互鐪嬪埌錛宑c 鍜?cxx 鎵ц command 鍚庯紝鐢熸垚 .o 鏂囦歡錛岀劧鍚庤繖浜?.o 鏂囦歡鍙互浣滀負 alink銆乻olink銆乴ink 鐨?inputs錛岃瀹冧滑 command 緇х畫浣跨敤錛屾渶鍚庤緭鍑洪潤鎬佸簱銆佸姩鎬佸簱浠ュ強鍙墽琛屾枃浠躲?/p>
鍏朵綑灞炴у彲浠ユ煡鏂囨。浜嗚В鍚箟銆?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/gcc_toolchain.gni 涔熸槸 gcc 鐨勶紝涓?simple_build 閲岀殑澶у悓灝忓紓錛屾病鏈夌壒鍒殑銆?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/apple/toolchain.gni 鍖哄埆鏈夛細 鍩烘湰涓婃槸鏍規嵁涓婇潰鍒嗘瀽鐨勮鐐歸厤緗紝鏈緇堢粨鏋滃湪姝わ細https://github.com/Streamlet/gn_toolchain 鏂板鐨勪竴浜涘樊寮傛湁錛?/p>
澧炲姞鍏ㄥ眬鍙傛暟 is_debug錛屽彲浠ュ湪 mac 涓嬬敓鎴?dSYM 涓嶄嬌鐢?python 鑴氭湰錛岀洿鎺ユ槸 mac 涓嬪姞浜嗕竴涓?template錛歛pp_bundle錛岀敤鏉ョ敓鎴?xxx.app錛屼富瑕侀厤緗潵鑷簬 create_bundle 鏂囨。閲岀殑渚嬪瓙 win 涓嬪鍔犱簡涓浜涢厤緗泦 鍔ㄦ?闈欐侀摼鎺?CRT錛?/build/config/win:console_subsystem銆?/build/config/win:static_runtime 鎺у埗鍙扮▼搴忋乄in32 紼嬪簭錛?/build/config/win:console_subsystem銆?/build/config/win:windows_subsystem 榪欎釜鍏跺疄涓鑸儏鍐典笅鐢ㄤ笉鐫錛屽彧瑕佸叆鍙e嚱鏁版槸 main/WinMain錛宭ink 榛樿灝辨槸鎺у埗鍙扮▼搴?Win32 紼嬪簭 XP 鏀寔錛?/build/config/win:console_subsystem_xp銆?/build/config/win:windows_subsystem_xp 鍏蜂綋瀹炵幇鏄摼鎺ュ弬鏁板姞 /SUBSYSTEM:CONSOLE,5.01 鎴?/SUBSYSTEM:WINDOWS,5.01銆傚叧閿槸鍚庨潰鐨勭増鏈彿 5.01錛屼負浜嗗姞鐗堟湰鍙峰垯蹇呴』鎸囧畾瀛愮郴緇熷悕縐幫紝鎵浠ュ垎浜?console_subsystem_xp 鍜?windows_subsystem_xp銆傚張錛寈p 榪欓噷鎻愪緵浜嗕袱涓?subsystem 鐨勯厤緗泦錛岄潪 xp 涔熸彁渚涗袱涓?/p>
浣嗘槸鎴戜滑娌℃湁鍔?_WIN32_WINNT=0x0501銆乄INVER=0x0501銆乢USING_V110_SDK71_錛屼篃娌℃湁鎸囧畾蹇呴』浣跨敤 7.0 鐗堟湰鐨?SDK錛岃繖浜涢兘鏄潪蹇呴』鐨勶紝鍙涓嶇敤鍒?XP 浠ュ悗娣誨姞鐨?API 鍗沖彲銆備嬌鐢ㄨ呭彲浠ュ湪鑷繁鐨?target 閲岄潰瀹氫箟榪欎簺瀹忋?/p>
鎻愪緵涓涓嬌鐢ㄦ渚嬶細https://github.com/Streamlet/gn_toolchain_sample 鍥犱負瀹冧互 git submodule 褰㈠紡寮曠敤浜?https://github.com/Streamlet/gn_toolchain錛屾墍浠?git clone 浠ュ悗錛岄渶瑕? 鐒跺悗鍦ㄦ牴鐩綍鎵ц錛氾紙紜繚 gn 鍜?ninja 宸茬粡鍦?PATH 涓級 鍗沖彲銆?/p>
Mac 涓嬩細棰濆鐢熸垚涓涓?objc 欏圭洰 objc_console_application 浠ュ強涓涓?app_bundle錛歯s_application.app銆?/p>
Win 浼氶澶栫敓鎴愪竴涓?Win32 欏圭洰 win32_application銆?/p>
Win 涓嬮渶瑕佸厛鎵ц涓涓?Visual Studio 甯︾殑鍛戒護琛岀幆澧冿紝濡?VS 2022 Community 鐨?鈥渪64 Native Tools Command Prompt for VS 2022鈥濓紝cl 絳夊伐鍏鋒墠浼氬彲鐢ㄣ?/p>
濡傛灉瑕佹祴璇?XP錛?2浣嶏級錛岀敤鈥渪86 Native Tools Command Prompt for VS 2022鈥濊繘鍏ワ紝CD 鍒伴」鐩洰褰曪紝鎵ц錛?/p>
鎴戜滑鍙敤鍑犲崄 KB 鐨勫ぇ灝忓畬鎴愪簡璺ㄧ鏀寔錛屾槸寰堣交閲忕殑涓涓厤緗傚鏋滄偍瑙夊緱瀹炵敤騫惰鍙繖縐嶆柟寮忥紝嬈㈣繋涓璧鋒潵緇存姢銆佸畬鍠勩?/p>
榪欐鏄洜涓哄偦閫煎ぇ寰蔣鏀逛簡 System32\IME\shared 閲岀殑涓滆タ錛屽鑷存棫緋葷粺鎷瘋繃鏉ョ殑鏂囦歡涓?System32\IME\shared 鐨勪笢瑗夸笉鍏煎浜嗐傝В鍐蟲柟寮忓緢鏆村姏錛氫粠浠ュ墠鐨勭増鏈鍒?System32\IME\shared 榪囨潵銆?/p> 涓嬭澆錛?a >https://www.streamlet.org/software/mspyforever/ 錛堝師鍙戜簬 GitHub Pages錛?018-10-13 13:36:04錛?/p> 棣栧厛璐翠釜鍥撅紝澶у鏉ヤ竴璧峰康鍙拌瘝~ 蹇靛畬浜嗘湪鏈夛紵寰堟縺鎯呮編婀冧箟鎰ゅ~鑶烘湁鏈ㄦ湁錛?/p> 榪欎簨鎯呮渶鏃╄拷婧埌鍓嶅勾 8 鏈堢殑涓綃囨枃绔犮?a href="http://www.shnenglu.com/Streamlet/archive/2014/02/17/188249.html" target="_blank">鍗佷釜姝ラ鎵懼洖 Win8 涓殑寰蔣鎷奸煶鏂頒綋楠屾ā寮?/a>銆嬶紝鍏跺疄灝辨槸鎵嬪伐娉ㄥ唽涓涓狢OM瀹屼簨錛屽彧鏄偦閫煎ぇ寰蔣鍒繪剰寮勪簡娉ㄥ唽琛ㄦ潈闄愭潵灞忚斀錛屾搷浣滆搗鏉ョ暐寰箒鐞愩傚埌鐩墠涓烘錛學in8閲嶈緋葷粺宸茬粡涓嶄笅鍗佹浜嗭紝姣忔閮芥槸榪欐牱鎵嬪伐鎿嶄綔錛屾垜宸茬粡鍘屽︿簡銆?/p> 鍙﹀榪樻湁Win8.1涓婄殑闂錛岀敱浜庡偦閫煎ぇ寰蔣宸茬粡瀹屽叏鍒犻櫎浜嗘枃浠訛紝灝辨病娉曡繖涔堟悶浜嗭紝灝辯畻浠嶹in8鎷瘋繃鏂囦歡鏉ワ紝涔熸棤娉曠畝鍗曟敞鍐屼嬌鐢ㄣ傚姞涓婃垜瀵?.1闈炲父闈炲父涓嶆劅鍐掞紝涓鐩存病鍘葷爺絀躲傚墠浜涘ぉ鐪嬪埌涔嬪墠鐨勯偅綃囨枃绔犻噷 Charles Leigh 鍥炲浜嗕袱綃囨枃绔狅紙ePig 閭g瘒鏄師鍒涘惂璨屼技錛屾劅璋級錛屾彁渚涗簡瑙e喅鏂規銆備簬鏄笂涓懆鏈埌鐜板湪灝辨崳榧撲釜涓閿仮澶嶅伐鍏鳳紝鏂逛究鑷繁浠ュ悗閲嶈鐢紝涔熸柟渚垮箍澶у井鎷煎厷銆?/p> 寰嫾鍏氾紙鍖呮嫭鎴戯級瀛滃瓬涓嶅︾殑榪芥眰寰嫾闀垮彞妯″紡鐨勬儏鎬錛岃鎴戦潪甯告劅鍔ㄣ傚笇鏈涘偦閫煎ぇ寰蔣鐪嬪埌鎴戜滑鐨勫績澹般傚埆鎼炰粈涔堢牬璇嶇粍杈撳叆娉曚簡錛屼綘鎼炰笉榪囨湰鍦熻繖涔堝鍘傚鐨勶紝浣犵殑涓嬮檺涔熸病鏈夋湰鍦熷巶瀹朵綆錛屽敮涓鐨勪紭鍔垮彲鑳藉氨鏄病騫垮憡娌″脊紿椾簡鍚с傝嚦浜庤緭鍏ョ畻娉曚粈涔堢殑錛屽湪璇嶇粍妯″紡閲岄潰鏍規湰涓嶈凍浠ヤ綋鐜板緱澶錛岄暱鍙ユā寮忔墠鏄冮獙鍟娿傚洖澶村惂錛?/p> 涓嬭澆欏甸潰錛?a title="http://www.streamlet.org/Software/MSPYForever/" target="_blank">http://www.streamlet.org/Software/MSPYForever/ CodePlex 欏圭洰欏甸潰錛?a title="https://mspyforever.codeplex.com/" target="_blank">https://mspyforever.codeplex.com/ 璇峰井鎷煎厷浠浼犳挱銆傛湁 Bug 鍙婃椂鍙嶉銆?/p> 姣旇緝鐨勫璞℃槸std::regex錛屾殏鏃跺彧姣旇緝涓ら」錛?/p> 1銆佽В鏋愭鍒欒〃杈懼紡鐨勯熷害 2銆佷嬌鐢ㄨВ鏋愬ソ鐨勬鍒欒〃杈懼紡鍘誨尮閰嶅瓧絎︿覆鐨勯熷害銆?/p> 嫻嬭瘯浠g爜濡備笅錛?span lang="EN-US"> SECTION_BEGIN(StdRegExParse100000); PERFORMANCE_TEST_BEGIN(StdRegExParse100000); for (int i = 0; i < 100000; ++i) { wregex r; r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); } PERFORMANCE_TEST_END(StdRegExParse100000); SECTION_END(); SECTION_BEGIN(xlRegExpParse100000); PERFORMANCE_TEST_BEGIN(xlRegExpParse100000); for (int i = 0; i < 100000; ++i) { RegExp r; r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); } PERFORMANCE_TEST_END(xlRegExpParse100000); SECTION_END(); SECTION_BEGIN(StdRegExMatch100000); { wregex r; r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); PERFORMANCE_TEST_BEGIN(StdRegExMatch100000); for (int i = 0; i < 100000; ++i) { regex_match(L"http://w-1.w-2.w-3.streamlet.org/", r); } PERFORMANCE_TEST_END(StdRegExMatch100000); } SECTION_END(); SECTION_BEGIN(xlRegExpMatch100000); { RegExp r; r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"); PERFORMANCE_TEST_BEGIN(xlRegExpMatch100000); for (int i = 0; i < 100000; ++i) { r.Match(L"http://w-1.w-2.w-3.streamlet.org/"); } PERFORMANCE_TEST_END(xlRegExpMatch100000); } SECTION_END(); 鍓嶄袱鍒欐槸鍒嗗埆浣跨敤std::wregex鍜寈l::RegExp瑙f瀽"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"鍗佷竾嬈★紝鍚庝袱鍒欐槸鎷挎潵鍖歸厤http://w-1.w-2.w-3.streamlet.org/鍗佷竾嬈°?/p> 緇撴灉濡備笅錛?/p> 鍖歸厤閫熷害宸緢澶氾紝瑙f瀽閫熷害宸笉澶氥?/p> 鑰冭檻鍒板湪瑙f瀽鈥?鈥濃?鈥濃?鈥濈殑鏃跺欙紝寮曞叆浜嗗緢澶毼佃竟錛屼簬鏄閭i儴鍒嗗仛鐐逛紭鍖栵紝鍘婚櫎涓嶅繀瑕佺殑蔚杈瑰拰鑺傜偣鏋勯狅紝鐒跺悗鍐嶆祴璇曪細 鍙互鐪嬪埌鏈夋墍鎻愰珮錛屼絾鏄В鏋愰熷害榪樻槸璺焥td:wregex鐨勫樊寰堝錛屽尮閰嶉熷害鏈夋槑鏄鵑鍏堛傜洰鍓嶅彧瑙f瀽鍒拔佃竟銆?NFA錛屽鏋滃啀鍋氱姸鎬佹満杞寲錛岃櫧鐒朵細鎻愰珮鍖歸厤閫熷害錛屽彲鏄В鏋愰熷害浼氳繘涓姝ヤ笅闄嶃傚洜姝わ紝涓寮濮嬪氨瑕佽冭檻浣跨敤涓縐嶆洿楂樻晥鐨勭姸鎬佹満瀛樺偍鏂規硶銆?/p> 榪欎袱澶╃潃鍑夌敓鐥呬簡錛屽ソ闅懼彈鍟娾︹?/p> 錛堟墍鏈夊唴瀹歸拡瀵?VC 緙栬瘧騫沖彴錛?/p> 涓銆亁86 浜屻亁64 64浣嶇紪璇戠幆澧冧笅錛屽彲浠ユ寚瀹?__cdecl銆乢_stdcall銆乢_fastcall錛屼絾鏄紪璇戝櫒浼氬拷鐣ュ畠浠備袱涓樉紺烘寚瀹氫簡涓嶅悓璋冪敤綰﹀畾鐨勫嚱鏁頒笉鏋勬垚閲嶈澆錛岃屾瀯鎴愰噸瀹氫箟閿欒銆?/p> 鍙槸錛孋 椋庢牸鐨勫埌搴曟湁浠涔堝潖澶勶紵C++鐨勮繖浜?cast 鍙堟湁浠涔堝ソ澶勫憿錛?/p> 鏄ㄥぉ浠ュ墠錛屾垜榪炶繖浜?cast 鏄粈涔堥兘涓嶇煡閬擄紙寰堟儹鎰э級銆傛槰澶╁洜涓哄悓浜嬩滑鎻愬埌榪欎歡浜嬶紝浜庢槸灝忓皬鐮旂┒浜嗕竴涓嬨備竴浜涘疄楠屼唬鐮佸涓嬶細 1銆佹棤緇ф壙鐨勭被鍨嬭漿鎹?/p> class A { }; class B { public: operator A() { return A(); } }; int main() { B b; A a = (A)b; // 鎵ц operator A() A a2 = static_cast<A>(b); // 鎵ц operator A() A a3 = dynamic_cast<A>(b); // 涓嶅厑璁?/font> A a4 = reinterpret_cast<A>(b); // 涓嶅厑璁?/font> A a5 = const_cast<A>(b); // 涓嶅厑璁?/font> return 0; } 2銆乧onst_cast struct A { int m; A(int m = 0) : m(m) { } }; int main() { const A a; A a2 = (A)a; // 鍏佽錛?/font>(A) 鏈夋病鏈夐兘涓鏍鳳紝a2 鏄釜鏂板彉閲?/font> a2.m = 1; // a2 鐨勬敼鍙樹笉褰卞搷 a A &a3 = (A &)a; // 鍏佽 a3.m = 2; // 褰卞搷 a // A &a4 = a; // 涓嶅厑璁革紝const 闄愬畾璧蜂綔鐢ㄤ簡 A *pa5 = (A *)&a; // 鍏佽 pa5->m = 3; // 褰卞搷 a // A *pa6 = &a; // 涓嶅厑璁革紝const 闄愬畾璧蜂綔鐢ㄤ簡 // A aa2 = const_cast<A>(a); // 涓嶅厑璁?/font> A &aa3 = const_cast<A &>(a); // 鍏佽 aa3.m = 2; // 褰卞搷 a A *paa5 = const_cast<A *>(&a); // 鍏佽 paa5->m = 3; // 褰卞搷 a const int i = 0; const int &i2 = i; const int *pi3 = &i; // int j = const_cast<int>(i); // 涓嶅厑璁?/font> int &j2 = const_cast<int &>(i2); // 鍏佽 int *pj3 = const_cast<int *>(pi3); // 鍏佽 return 0; } 浠庣1鐐圭殑璇曢獙錛屽姞涓婂鐣岃祫鏂欑殑璇存槑錛岀湅涓婂幓const_case 鍙厑璁稿叿鏈変笉鍚宑v闄愬畾絎︾殑鍚岀被鍨嬩箣闂寸殑杞崲銆? 鍊煎緱娉ㄦ剰鐨勬槸錛屽鏋滅被鍨婣涓嶆槸鎸囬拡鎴栧紩鐢紝涓嶈兘浣跨敤const_cast錛堜嬌鐢ㄤ簡涔熸棤鎰忎箟錛岃 A a2 = (A)a 榪欎竴琛岋級 鍦?const_cast 鍙互浣跨敤鐨勬儏褰紝(T)value 褰㈠紡閮藉彲浠ヤ嬌鐢紝(T)value 鍦ㄥ姛鑳戒笂瀹屽叏瑕嗙洊 const_cast銆? 2銆乺einterpret_cast class A { public: operator int *() { return nullptr; } }; int main() { int i = 0; double d = 1.0; int *p = nullptr; // int di = reinterpret_cast<int>(d); // 涓嶅厑璁?/font> int pi = reinterpret_cast<int>(p); // 鍏佽 // int pi2 = static_cast<int>(p); // 涓嶅厑璁?/font> // double id = reinterpret_cast<double>(i);// 涓嶅厑璁?/font> // double pd = reinterpret_cast<double>(p);// 涓嶅厑璁?/font> int *ip = reinterpret_cast<int *>(i); // 鍏佽 // int *ip2 = static_cast<int *>(i); // 涓嶅厑璁?/font> // int *dp = reinterpret_cast<int *>(d); // 涓嶅厑璁?/font> A a; int *pa = (int *)a; // 鍏佽 int *pa2 = static_cast<int *>(a); // 鍏佽 // int *p2 = reinterpret_cast<int *>(a); // 涓嶅厑璁?/font> return 0; } 鐪嬩笂鍘伙紝reinterpret_cast 鍙互鐞嗚В涓哄湪鎸囬拡鍜屾暟鍊間箣闂磋漿鎹㈢殑涓縐嶆柟寮忥紝鏃犲叧浠諱綍榪愮畻絎﹂噸杞斤紝浠呬粎鎶婃寚閽堣漿涓哄瓧闈㈠鹼紝鎴栬呮妸鏁板瓧杞負鎸囬拡錛岃漿鎹㈢殑榪囩▼涓兼病鏈変換浣曟敼鍙橈紝鍙槸鍛婅瘔緙栬瘧鍣ㄤ笉瑕佹姤綾誨瀷涓嶅尮閰嶈屽凡銆? 鍙﹀錛屽湪reinterpret_cast鍙互浣跨敤鐨勬儏褰紝static_cast 鏄笉鍙互浣跨敤鐨勶紝闄ら潪瀹氫箟浜嗙浉搴旂殑綾誨瀷杞崲榪愮畻絎︺? 鍦?reinterpret_cast 鍙互浣跨敤鐨勬儏褰紝(T)value 鐨勬柟寮忓悓鏍峰彲浠ュ畬鍏ㄨ儨浠伙紝(T)value 鍦ㄥ姛鑳戒笂瀹屽叏瑕嗙洊 reinterpret_cast銆? dynamic_cast 鎴戣嚜璁や負榪樻槸鐞嗚В鐨勶紝灝變笉璇曚簡銆? 緇間笂錛屾垜鐨勭悊瑙e涓嬶細 1銆?/b>static_cast + const_cast + reinterpret_cast = (T)value C++ 鎶婂師鏉?/b>C椋庢牸鐨勭殑榪欎笁涓?/b>cast鎷嗗垎鎴愪簡涓変釜錛屼笁鑰呯浉浜掓浜ゃ傚ぇ澶氭暟鎯呭喌涓嬶紝搴旇鏄?/b> static_cast 鍦ㄥ彇浠g潃 (T)value錛涘彧鏄湪鍘婚櫎 cv 闄愬畾絎︾殑鏃跺欙紝鎹㈢敤 const_cast錛涘湪鍙栨寚閽堝瓧闈㈠肩殑鏃跺欙紝鎹㈢敤 reinterpret_cast銆傜被鍨嬭漿鎹㈣繍綆楃 operator T() 鐢?static_cast 璐熻矗鎵ц銆?/b> 2銆?/b>dynamic_cast 鏄?C++ 鏂板鐨勶紝鐢ㄤ簬澶氭佺殑鎯呭艦錛屼笖鍙厑璁歌漿鎹㈠叿鏈夊鎬佸叧緋葷殑緇ф壙鏍戜笂鐨勭被鍨嬬殑鎸囬拡鍜屽紩鐢紝涓嶅厑璁歌漿鎹㈢被鍨嬫湰韜傚畠涓嶆槸閽堝 (T)value鑰屽嚭鐜扮殑錛屼袱鑰呮病鏈変換浣曠珵浜夊叧緋伙紝鍙槸鍙栧喅浜庝笉鍚岀殑闇姹傘?/b> 錛堜笉鐭ヨ繖鏍風悊瑙f槸鍚︽紜紝璇鋒壒璇勬寚姝錛? 鑷充簬緗戜笂鎺ㄥ磭鐢ㄦ柊鍐欐硶錛屾槸涓嶆槸涓轟簡鏇寸粏鍖栬屽鏄撶悊瑙o紵鏈夋病鏈変粈涔堟槸 (T)value 鍋氫笉鍒拌?*_cast 鑳藉仛鍒扮殑錛熸垨鑰呭弽榪囨潵錛?鏋勫緩緋葷粺瀹夎
gn --version
浠ュ強 ninja --version
錛岃兘榪愯鍗沖彲鐩爣
buildconfig = "//build/BUILDCONFIG.gn"
宸ュ叿閾炬惌寤?/h2>
鍩虹姒傚康
buildconfig = "//build/BUILDCONFIG.gn"
set_default_toolchain("//build/toolchain:gcc")
toolchain("gcc") {
# ...
}
宸ュ叿閾句腑鐨勫伐鍏?/h3>
"cc": C 緙栬瘧鍣?br />
"cxx": C++ 緙栬瘧鍣?br />
"cxx_module": 鏀寔 module 鐨?C++ 緙栬瘧鍣?br />
"objc": Objective C 緙栬瘧鍣?br />
"objcxx": Objective C++ 緙栬瘧鍣?br />
"rc": Windows 璧勬簮鑴氭湰緙栬瘧鍣?br />
"asm": 姹囩紪鍣?br />
"swift": Swift 緙栬瘧鍣?/li>
"alink": 闈欐佸簱閾炬帴鍣?br />
"solink": 鍔ㄦ佸簱閾炬帴鍣?br />
"link": 鍙墽琛屾枃浠墮摼鎺ュ櫒toolchain("gcc") {
tool("cc") {
command = "gcc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("cxx") {
command = "g++ -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("alink") {
command = "rm -f {{output}} && ar rcs {{output}} {{inputs}}"
outputs = [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
# ...
}
tool("solink") {
command = "g++ -shared {{ldflags}} -o $sofile $os_specific_option @$rspfile"
outputs = [ sofile ]
# ...
}
tool("link") {
command = "g++ {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group {{libs}}"
outputs = [ outfile ]
# ...
}
tool("stamp") {
command = "touch {{output}}"
}
tool("copy") {
command = "cp -af {{source}} {{output}}"
}
}
瀵規瘮 Chromium 涓殑閰嶇疆
Linux
Mac
Win
寤虹珛鎴戜滑鐨勫伐鍏烽摼
gn gen out --args="is_debug=true"
浼犲叆銆傞粯璁?is_debug 涓?false錛屽紑鍚墍鏈変紭鍖栥?/p>
$ld ... && dsymutil ... && strip
浣跨敤妗堜緥
git submodule update --init
涓涓嬨?/p>
gn gen out
ninja -C out
gn gen out --args="target_cpu=\"x86\""
ninja -C out
鎬葷粨
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
]]>
鍚嶇О 浼犲弬鏂瑰紡 鏍堟竻鐞?/td> C 璇█鍑芥暟閲嶅懡鍚嶏紙渚嬶細int func(int, double)錛?/td> __cdecl 浠庡彸鑷沖乏鍘嬫爤 涓昏皟鍑芥暟 鍓嶉潰鍔犫淿鈥濓紙_func錛?/td> __stdcall 浠庡彸鑷沖乏鍘嬫爤 琚皟鍑芥暟 鍓嶉潰鍔犫淿鈥濓紝鍚庨潰鍔犫淍鈥濆啀鍔犲弬鏁板崄榪涘埗瀛楄妭鏁幫紙_func@12錛?/td> __fastcall 鍓嶄袱涓笉澶т簬DWORD闀垮害鐨勫弬鏁頒粠宸﹁嚦鍙沖垎鍒瓨鍒?ECX銆丒DX錛屽叾浣欎粠鍙寵嚦宸﹀帇鏍?/td> 琚皟鍑芥暟 鍓嶉潰鍔犫淍鈥濓紝鍚庨潰鍔犫淍鈥濆啀鍔犲弬鏁板崄榪涘埗瀛楄妭鏁幫紙@func@12錛?/td> __thiscall ECX 瀛?this錛屽叾浣欎粠鍙寵嚦宸﹀帇鏍?/td> 琚皟鍑芥暟 浠呯敤浜?C++
鍚嶇О 浼犲弬鏂瑰紡 鏍堟竻鐞?/td> __fastcall 鍓嶅洓涓暣鏁?嫻偣鏁版斁鍦?RCX/XMM0銆丷DX/XMM1銆丷8/XMM2銆丷9/XMM3錛屽叾浣欏帇鏍堛?br>濡傛灉鍓?4 涓弬鏁板垎鍒負 int銆乫loat銆乴ong銆乨ouble錛屽畠浠皢鍒嗗埆琚瓨鍒?RCX銆乆MM1銆丷8銆乆MM3 琚皟鍑芥暟
宸﹀煎拰鍙沖?/font>
1 Every expression is either an lvalue or an rvalue.
琛ㄨ揪寮忎笉鏄乏鍊煎氨鏄彸鍊箋?/font>
2 An lvalue refers to an object or function. Some rvalue expressions鈥攖hose of class or cv-qualified class type鈥攁lso refer to objects. 47)
宸﹀兼槸鎸囦竴涓璞℃垨鑰呭嚱鏁般傛煇浜涘彸鍊鹼紙閭d簺甯︽垨涓嶅甫cv闄愬畾絎︾殑綾葷被鍨嬶級涔熸槸瀵硅薄銆?/font>
3 [Note:
some built-in operators and function calls yield lvalues. [Example: if E is an expression of pointer type, then *E is an lvalue expression referring to the object or function to which E points. As another example, the function
int& f();
yields an lvalue, so the call f() is an lvalue expression. ] ]
[娉ㄦ剰錛氭煇浜涘唴緗繍綆楃浠ュ強涓浜涘嚱鏁拌皟鐢ㄤ細榪斿洖宸﹀箋俒渚?錛氬鏋?E 鏄竴涓寚閽堢被鍨嬬殑琛ㄨ揪寮忥紝閭d箞 *E 鏄竴涓乏鍊艱〃杈懼紡錛屾寚紺烘寚閽?E 鎵鎸囧悜鐨勯偅涓璞℃垨鑰呭嚱鏁般備緥2錛氬嚱鏁?br>int& f();
榪斿洖宸﹀鹼紝鎵浠ュ嚱鏁拌皟鐢?f() 鏄竴涓乏鍊艱〃杈懼紡銆俔 ]
4 [Note: some built-in operators expect lvalue operands. [Example: built-in assignment operators all expect their left hand operands to be lvalues. ] Other built-in operators yield rvalues, and some expect them. [Example: the unary and binary + operators expect rvalue arguments and yield rvalue results. ] The discussion of each built-in operator in clause 5 indicates whether it expects lvalue operands and whether it yields an lvalue. ]
[娉ㄦ剰錛氭煇浜涘唴緗繍綆楃闇瑕佸乏鍊兼搷浣滄暟銆俒渚嬶細鎵鏈夊唴緗殑璧嬪艱繍綆楃鐨勫乏鎿嶄綔鏁伴兘蹇呴』鏄乏鍊箋俔 鏈変簺鍐呯疆榪愮畻絎︿細榪斿洖鍙沖肩粨鏋滐紝鏈変簺浼氶渶瑕佸彸鍊兼搷浣滄暟銆俒渚嬶細涓鍏冭繍綆楃鈥?鈥濆拰浜屽厓榪愮畻絎︹?鈥濋兘闇瑕佸彸鍊兼搷浣滄暟錛屽茍涓旇繑鍥炲彸鍊肩粨鏋溿俔 鎴戜滑鍦ㄦ潯嬈?5 涓細瀵規墍鏈夊唴緗繍綆楃榪涜璁ㄨ錛屾寚鍑哄畠浠殑鎿嶄綔鏁板拰榪斿洖緇撴灉鏄乏鍊艱繕鏄彸鍊箋俔
5 The result of calling a function that does not return a reference is an rvalue. User defined operators are functions, and whether such operators expect or yield lvalues is determined by their parameter and return
types.
璋冪敤榪斿洖鍊間負闈炲紩鐢ㄧ被鍨嬬殑鍑芥暟錛岀粨鏋滄槸鍙沖箋傜敤鎴瘋嚜瀹氫箟鐨勮繍綆楃涔熸槸鍑芥暟錛岃繖浜涜繍綆楃鐨勬搷浣滄暟浠ュ強緇撴灉鏄乏鍊艱繕鏄彸鍊鹼紝鍙栧喅浜庯紙榪愮畻絎﹂噸杞斤級鍑芥暟鐨勫弬鏁板拰榪斿洖鍊肩被鍨嬨?/font>
6 An expression which holds a temporary object resulting from a cast to a nonreference type is an rvalue (this includes the explicit creation of an object using functional notation (5.2.3)).
瀵歸潪寮曠敤綾誨瀷鐨勮漿鎹㈣〃杈懼紡錛堝寘鎷嬌鐢ㄥ嚱鏁板紡鐨勮鍙瘋繘琛屾樉紺哄垱寤猴級鏄彸鍊鹼紝瀹冨皢榪斿洖涓涓復鏃跺璞°?/font>
__________________
47) Expressions such as invocations of constructors and of functions that return a class type refer to objects, and the implementation can invoke a member function upon such objects, but the expressions are not lvalues.
鏈変簺琛ㄨ揪寮忥紝姣斿璋冪敤鏋勯犲嚱鏁扮殑琛ㄨ揪寮忥紝浠ュ強璋冪敤榪斿洖綾葷被鍨嬬殑鍑芥暟鐨勮〃杈懼紡錛屽畠浠篃鏄璞★紝涓斿彲浠ュ瀹冧滑璋冪敤鎴愬憳鍑芥暟錛屼絾榪欑琛ㄨ揪寮忎笉鏄乏鍊箋?/font>
____________________________________鍗庝附鐨勫垎欏電____________________________________
7 Whenever an lvalue appears in a context where an rvalue is expected, the lvalue is converted to an rvalue; see 4.1, 4.2, and 4.3.
濡傛灉鍦ㄤ竴涓渶瑕佸彸鍊肩殑鍦哄悎鍑虹幇浜嗗乏鍊鹼紝榪欎釜宸﹀煎皢琚漿鎹㈡垚鍙沖箋?br>瑙?4.1銆?.2銆?.3銆?/font>
8 The discussion of reference initialization in 8.5.3 and of temporaries in 12.2 indicates the behavior of lvalues and rvalues in other significant contexts.
12.2 涓叧浜庡紩鐢ㄧ殑鍒濆鍖栧拰鍏充簬涓存椂瀵硅薄鐨勮璁猴紝涔熸寚鍑轟簡宸﹀彸鍊煎湪鍏朵粬閲嶈鍦哄悎鐨勮涓恒?/font>
9 Class rvalues can have cv-qualified types; non-class rvalues always have cv-unqualified types. Rvalues shall always have complete types or the void type; in addition to these types, lvalues can also have incomplete types.
綾葷被鍨嬬殑鍙沖煎彲浠ュ叿鏈?cv 闄愬畾絎︼紱闈炵被綾誨瀷鐨勫彸鍊間笉鑳借 cv 闄愬畾絎︿慨楗般傚彸鍊奸氬父鏄畬鏁寸被鍨嬫垨鑰?void 綾誨瀷錛岃屽浜庡乏鍊兼潵璇達紝闄や簡瀹屾暣綾誨瀷鍜?void 綾誨瀷澶栵紝榪樺彲浠ユ槸涓嶅畬鏁寸被鍨嬨?/font>
10 An lvalue for an object is necessary in order to modify the object except that an rvalue of class type can also be used to modify its referent under certain circumstances. [Example: a member function called for an object (9.3) can modify the object. ]
閫氬父鎯呭喌涓嬶紝濡傛灉瑕佷慨鏀逛竴涓璞★紝瀹冨繀欏繪槸宸﹀箋備絾鍦ㄦ煇浜涚壒瀹氱殑鍦哄悎錛屽彸鍊煎艦寮忕殑綾誨璞′篃鍙互琚慨鏀廣俒渚嬶細璋冪敤涓涓璞$殑鎴愬憳鍑芥暟錛?.3錛夛紝鍙互淇敼瀵硅薄鏈韓銆俔
11 Functions cannot be modified, but pointers to functions can be modifiable.
鍑芥暟錛堝璞★級涓嶈兘錛堝湪榪愯鏃訛級琚慨鏀癸紝浣嗘槸鍑芥暟鎸囬拡鍙互銆?/font>
12 A pointer to an incomplete type can be modifiable. At some point in the program when the pointed to type is complete, the object at which the pointer points can also be modified.
鎸囧悜涓涓笉瀹屾暣綾誨瀷鐨勬寚閽堝彲鑳芥槸鍙慨鏀圭殑銆傚綋榪欎釜琚寚鍚戠殑綾誨瀷鏌愭椂鏌愬埢鎴愪負瀹屾暣綾誨瀷鍚庯紝榪欎釜鎸囬拡鎵鎸囧悜鐨勯偅涓璞′篃鏄彲淇敼鐨勩?/font>
13 The referent of a const-qualified expression shall not be modified (through that expression), except that if it is of class type and has a mutable component, that component can be modified (7.1.5.1).
琚?const 闄愬畾鐨勮〃杈懼紡鎵瀵瑰簲鐨勫璞′笉鑳斤紙閫氳繃璇ヨ〃杈懼紡錛夎淇敼錛涢櫎闈炶繖涓璞℃槸綾葷被鍨嬪茍涓斿惈鏈?mutable 鎴愬憳錛屾鏃惰 mutable 鎴愬憳鍙互琚慨鏀廣?/font>
14 If an expression can be used to modify the object to which it refers, the expression is called modifiable. A program that attempts to modify an object through a nonmodifiable lvalue or rvalue expression is illformed.
濡傛灉涓涓〃杈懼紡鍙互琚敤鏉ヤ慨鏀規琛ㄨ揪寮忓搴旂殑瀵硅薄錛岄偅涔堣繖涓〃杈懼紡琚О涓哄彲淇敼鐨勩備紒鍥鵑氳繃涓涓笉鍙慨鏀圭殑宸﹀艱呭彸鍊艱〃杈懼紡鍘諱慨鏀逛竴涓璞★紝鏄潪娉曠殑銆?/font>
15 If a program attempts to access the stored value of an object through an lvalue of other than one of the following types the behavior is undefined 48):
鈥?the dynamic type of the object,
鈥?a cv-qualified version of the dynamic type of the object,
鈥?a type that is the signed or unsigned type corresponding to the dynamic type of the object,
鈥?a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic type of
the object,
鈥?an aggregate or union type that includes one of the aforementioned types among its members (including,
recursively, a member of a subaggregate or contained union),
鈥?a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
鈥?a char or unsigned char type.
濡傛灉紼嬪簭閫氳繃涓嬪垪綾誨瀷涔嬪綾誨瀷鐨勫乏鍊艱闂竴涓璞$殑鍊鹼紝鍏惰涓烘槸鏈畾涔夌殑錛?/font>
鈥斺斿璞$殑鍔ㄦ佺被鍨嬶紱
鈥斺擟V 闄愬畾鐨勫璞″姩鎬佺被鍨嬶紱
鈥斺斿璞$殑鍔ㄦ佺被鍨嬪搴旂殑鏈夌鍙鋒垨鏃犵鍙風被鍨嬶紱
鈥斺擟V 闄愬畾鐨勫璞″姩鎬佺被鍨嬫湁絎﹀彿鎴栨棤絎﹀彿綾誨瀷錛?br>鈥斺斾竴涓垚鍛樹腑鍚湁鑱氬悎鎴栬呰仈鍚堢被鍨嬬殑鑱氬悎鎴栬呰仈鍚堢被鍨嬶紙鍖呮嫭閫掑綊褰㈠紡鐨勫畾涔変互鍙婃垚鍛樹腑鏈夊瓙鑱氬悎綾誨瀷鎴栬呭寘鍚竴涓仈鍚堬級
鈥斺斿璞$殑鍔ㄦ佺被鍨嬬殑鍩虹被綾誨瀷錛堝彲浠ヨ cv 闄愬畾絎︿慨楗幫級
鈥斺攃har 鎴?unsigned char 綾誨瀷
__________________
48) The intent of this list is to specify those circumstances in which an object may or may not be aliased.
緇欏嚭榪欎喚鍒楄〃鐨勭洰鐨勬槸鎸囨槑涓浜涚壒瀹氭儏褰紝鍦ㄨ繖浜涙儏褰笅瀵硅薄鍙兘琚噸鍙狅紝浣嗕篃鏈夊彲鑳戒笉鏄紝鎴戜滑鏃犳硶棰勭煡銆?/font>
____________________________________鍗庝附鐨勫垎闅旂____________________________________
浠ヤ笂錛屾眰鎸囨錛屽寘鎷悊瑙h鍖哄拰璇█緇勭粐涓嶅悎鐞嗙殑錛屾榪庢寚鍑簙 ^_^
鎺掔増鏂歸潰鐨勫ぇ姒傛湁錛屽浣曠緝榪涳紝濡備綍浣跨敤絀烘牸銆佹崲琛岋紝絳夌瓑銆傚懡鍚嶆柟闈㈢殑鍖呮嫭鍙橀噺銆佸嚱鏁般佺被銆佹枃浠剁殑鍙栧悕絳夌瓑銆備功鍐欓昏緫鏂歸潰鐨勫氨姣旇緝澶氫簡錛屽彲鑳藉寘鎷細
鏄惁鍏ㄩ潰浣跨敤寮傚父銆佸嚭閿欏鐞嗚祫婧愭竻鐞嗗浣曠粍緇囥佸浣曞埄鐢ㄧ紪璇戞彁紺洪槻姝㈠父瑙侀敊璇︹?/p>
涓鏃墮棿鍒椾笉鍏ㄣ傜綉涓婂父瑙佺殑鏂囨。鎴戜細鍙傝冪殑銆傞櫎姝や箣澶栵紝鎯充粠澶у榪欓噷寰佹眰涓嬶紝浠ヤ笂鍑犱釜澶ф柟闈箣澶栵紝榪樻湁娌℃湁姣旇緝閲嶈鐨勬柟闈紵澶у鏃ュ父宸ヤ綔涓湁娌℃湁閬囧埌涓浜涚壒鍒笇鏈涘埆浜轟篃浣跨敤鍜岃嚜宸變竴鏍風殑鏂瑰紡鍋氱殑浜嬶紵浠ュ強錛屽摢浜涜瀹氭瘮杈冨鏄撹鎺ㄥ姩錛熷摢浜涜瀹氫笉瀹規槗琚帹鍔紵濡傛灉鏈変竴涓鍒欏己鍔犲湪浣犲ご涓婏紝浣犱細鏈夋庢牱鐨勫績鐞嗭紵絳夌瓑鈥︹?/p>
濡傛灉鎮ㄦ湁鎯蟲硶錛岃鍥炲涓嬶紝鎴戜滑璁ㄨ璁ㄨ^_^
----------
欏轟究鍐嶉棶涓棶棰橈紝Windows 涓婄殑寮鍙戯紝澶у鍠滄鍔ㄦ侀摼鎺?CRT錛?MD銆?MDd錛?榪樻槸闈欐侀摼鎺?CRT錛?MT銆?MTd錛夛紵涓轟粈涔堬紵涓漢鍊懼悜浜庡摢縐嶏紵鍦ㄥ叕鍙擱噷鍙堟槸鎬庢牱鍋氱殑錛?/p>
紼嶅井瑙i噴涓嬶紝鍥犱負鏈夊彲鑳芥湁浜轟細璇細錛氭斁鏂扮嚎紼嬮噷闈㈠幓涓嶅氨鍙互浜嗭紵榪欐病鏈夎В鍐抽棶棰樸傚姝ょ殑璇濓紝浣犻偅涓嚎紼嬪嚱鏁版庝箞鍐欙紵鎴栬呯嚎紼嬪嚱鏁伴噷璋冪敤鐨勬煇涓換鍔″嚱鏁版庝箞鍐欙紵鎬諱箣錛屽綰跨▼铏界劧鎬繪槸鍑虹幇鍦ㄨ繖浜涢棶棰樼殑瑙e喅鏂規涓紝浣嗕笉鏄綰跨▼瑙e喅浜嗚繖涓棶棰樸傚棷鈥︹︿笉鐭ラ亾璇存竻妤氫簡娌★紵
鐩墠鎴戝績閲岀殑絳旀鍙湁榪欎竴縐嶆ā寮忥細
bool DoTask(HANDLE hQuitSignal)
{
while (!QuitCondition)
{
if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0)
{
return false;
}
// Do something
}
return true;
}
鍏朵腑錛屸?/ Do something鈥濋儴鍒嗚緇嗗寲鍒扮灛闂存墽琛屽畬鎴愮殑緇嗗害銆?/p>
浣嗘槸鎴戝緢鍥版儜鐨勬槸錛屽鏋滆繖浜涗換鍔″緢綣侀噸錛岄毦閬撴垜蹇呴』姣忚繘琛屼竴浜涙搷浣滃氨 if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0) 媯鏌ヤ笅鍚楋紵榪欐牱宀備笉鏄繖縐嶆嫻嬩唬鐮佸厖鏂ュ湪浠誨姟涓簡錛?/p>
涓嶇煡鍚勪綅鏈変綍緇忛獙鍜屼綋浼氾紝姹傛暀~
寰堝鏃跺欐垜浠渶瑕佽繑鍥?浼犲叆涓鍫嗗弬鏁幫紝鎵浠ヤ笉寰椾笉姣忔瀹氫箟涓浜涗負浜嗘暟鎹紶杈撶殑緇撴瀯銆俆uple 灝辨槸鐢ㄦ潵瑙e喅榪欎竴闂鐨勶紝瀹冩彁渚涘嵆鏃舵瀯閫犱竴涓繖鏍風殑緇撴瀯浣撶殑鍔熻兘銆傝屾墍浠樺嚭鐨勪唬浠鋒槸錛屼撫澶卞悇涓垚鍛樼殑鏄庣‘鍚箟錛屽彧鐣欎笅鎴愬憳鐨勫簭鍙楓?/p>
涓や釜鍏冪礌鐨?Tuple 灝辨槸 Pair錛屽 std::pair銆備笅闈㈡垜浠潵寤虹珛閽堝鏈夐檺涓厓绱犵殑 Tuple銆傚浜庝竴涓厓绱犮佷袱涓厓绱犮佷笁涓厓绱狅紝鎴戜滑鍙互鍒嗗埆濡備笅瀹炵幇錛?/p>
template <typename T0>
struct Tuple
{
T0 _0;
};
template <typename T0, typename T1>
struct Tuple
{
T0 _1;
T1 _1;
};
template <typename T0, typename T1, typename T2>
struct Tuple
{
T0 _1;
T1 _1;
T2 _2;
};
浣嗘槸榪欎笁涓啓鍦ㄤ竴璧鳳紝灝變細鍑洪敊銆備負姝わ紝鎴戜滑鍙互鍏堝畾涔変竴涓惈瓚沖澶氭ā鐗堝弬鏁扮殑 Tuple錛岀劧鍚庝笂闈笁涓垎鍒綔涓哄亸鐗瑰寲鐗堟湰錛?/p>
template <typename T0 = NullType, typename T1= NullType, typename T2= NullType, typename T3= NullType, typename T4= NullType>
struct Tuple;
template <typename T0>
struct Tuple<T0>
{
T0 _0;
};
template <typename T0, typename T1>
struct Tuple<T0, T1>
{
T0 _1;
T1 _1;
};
template <typename T0, typename T1, typename T2>
struct Tuple<T0, T1, T2>
{
T0 _1;
T1 _1;
T2 _2;
};
濡傛灉鎵嬪啓鐨勮瘽錛岃繖涔熷彲浠ャ傚鏋滀笉鎵嬪啓錛屾垜浠彲浠ョ戶緇敤涔嬪墠銆?a href="http://www.shnenglu.com/Streamlet/archive/2011/01/17/138693.html" target="_blank">C++ 涓?Function 瀵硅薄鐨勫疄鐜幫紙涓嬶級銆嬩腑鐨勫畯寰幆鏂規銆傛鏂規鐨勪竴涓寮忕増鏈 xlMacros.h銆?/p>
瀹氫箟甯﹂粯璁ゅ?NullType 鐨勬ā鐗堝弬鏁板0鏄庡簭鍒楀涓嬶細
#define XL_TUPLE_TYPENAME_DECLARE_NT_PATTERN(n) typename T##n = NullType
#define XL_TUPLE_TYPENAME_DECLARE_NT(n) XL_REPZ(XL_TUPLE_TYPENAME_DECLARE_NT_PATTERN, n, XL_COMMA)
瀹冨皢琚睍寮涓猴細 typename T0 = NullType, typename T1 = NullType, typename T2 = NullType, 鈥? typename Tn = NullType
瀹氫箟涓嶅甫榛樿鍊肩殑妯$増鍙傛暟澹版槑搴忓垪濡備笅錛?/p>
#define XL_TUPLE_TYPENAME_DECLARE_PATTERN(n) typename T##n
#define XL_TUPLE_TYPENAME_DECLARE(n) XL_REPZ(XL_TUPLE_TYPENAME_DECLARE_PATTERN, n, XL_COMMA)
瀹冨皢琚睍寮涓猴細typename T0, typename T1, typename T2, 鈥? typename Tn
瀹氫箟妯$増鍙傛暟浣跨敤搴忓垪濡備笅錛?/p>
#define XL_TUPLE_TYPENAME_LIST_PATTERN(n) T##n
#define XL_TUPLE_TYPENAME_LIST(n) XL_REPZ(XL_TUPLE_TYPENAME_LIST_PATTERN, n, XL_COMMA)
瀹冨皢琚睍寮涓?T0, T1, T2, 鈥? Tn
瀹氫箟鎴愬憳鍙橀噺澹版槑搴忓垪濡備笅錛?/p>
#define XL_TUPLE_MEMBER_DECLARE_PATTERN(n) T##n _##n;
#define XL_TUPLE_MEMBER_DECLARE(n) XL_REPZ(XL_TUPLE_MEMBER_DECLARE_PATTERN, n, XL_NIL)
瀹冨皢琚睍寮涓猴細T0 _0; T1 _1; T2 _2; 鈥?Tn _n;
鐜板湪鎴戜滑寮濮嬬粍瑁咃細
#ifndef XL_TUPLE_DEFINE_MAX
#define XL_TUPLE_DEFINE_MAX 20
#endif
template <XL_TUPLE_TYPENAME_DECLARE_NT(XL_INC(XL_TUPLE_DEFINE_MAX))>
struct Tuple;
template <XL_TUPLE_TYPENAME_DECLARE(n)>
struct Tuple<XL_TUPLE_TYPENAME_LIST(n)>
{
XL_TUPLE_MEMBER_DECLARE(n)
};
鍏朵腑鍚庝竴涓繕甯︽湁瀹忓弬鏁?n銆傛垜浠皢榪欐暣涓涓畾涔夋垚瀹忥紝鐒跺悗榪涜瀹忓驚鐜細
#define XL_TUPLE_IMPLEMENT_PATTERN(n) \
\
template <XL_TUPLE_TYPENAME_DECLARE(n)> \
struct Tuple<XL_TUPLE_TYPENAME_LIST(n)> \
{ \
XL_TUPLE_MEMBER_DECLARE(n) \
}; \
#define XL_TUPLE_IMPLEMENT(n) XL_REPY(XL_TUPLE_IMPLEMENT_PATTERN, n, XL_NIL)
涔嬪悗鍐嶄嬌鐢ㄨ繖涓畯錛?/p>
XL_TUPLE_IMPLEMENT(XL_TUPLE_DEFINE_MAX)
鍒版涓烘錛屼笂鏂囦竴寮濮嬫彁鍑虹殑 Tuple 宸茬粡瀹炵幇錛屽茍鏀寔鍒版渶澶х害 20 涓厓绱犲乏鍙熾?/p>
鐒跺悗鎴戜滑鍙互鑰冭檻澧炲姞鍚勭鏂逛究浣跨敤鐨勫姛鑳姐?/p>
#define XL_TUPLE_NOT_EQUAL_PATTERN(n) this->_##n != that._##n
#define XL_TUPLE_NOT_EQUAL(n) XL_REPZ(XL_TUPLE_NOT_EQUAL_PATTERN, n, ||)
#define XL_TUPLE_LITTER_PATTERN(n) if (this->_##n < that._##n) \
{ \
return true; \
} \
else if (that._##n < this->_##n) \
{ \
return false; \
}
#define XL_TUPLE_LITTER(n) XL_REPZ(XL_TUPLE_LITTER_PATTERN, n, XL_NIL)
#define XL_TUPLE_GREATER_PATTERN(n) if (this->_##n > that._##n) \
{ \
return true; \
} \
else if (that._##n > this->_##n) \
{ \
return false; \
}
#define XL_TUPLE_GREATER(n) XL_REPZ(XL_TUPLE_GREATER_PATTERN, n, XL_NIL)
鍚屾椂 Tuple 涓篃澧炲姞鐩稿簲鐨勫嚱鏁幫紝鍗沖彲銆?/p>
鏈緇堜唬鐮佽 xlTuple.h錛岃繖閲屼笉璐翠簡銆?/p>
璇峰澶氭寚姝c?/p>
template <typename T1, typename T2>
XXX Min(T1 t1, T2 t2)
{
return (t1 < t2 ? t1 : t2);
}
鍏朵腑 XXX 鏄垜浠鎺ㄥ鍑虹殑綾誨瀷銆?
浠ヤ笅鏄竴涓け璐ョ殑灝濊瘯銆?
鎴戣寰?Loki 閲屾湁鍏充簬濡備綍鍒ゆ柇鏌愪釜綾誨瀷鑳藉惁闅愬紡杞崲涓哄彟涓涓被鍨嬬殑涓滆タ錛屽ぇ鎰忓涓嬶細
template <typename T, typename U>
class Conversion
{
private:
typedef char Small;
class Big { char XXX[2]; };
static Small Test(U);
static Big Test(...);
static T MakeT();
public:
enum
{
Exists = (sizeof(Test(MakeT())) == sizeof(Small)),
};
};
濡傛錛孋onversion<T, U>::Exists 灝辮兘鍒ゆ柇 T 鍒?U 鐨勮漿鎹㈡槸鍚﹀瓨鍦ㄤ簡銆?
鐒跺悗鍐嶆悶涓夋嫨錛?
template <bool Condition, typename TypeIfTrue, typename TypeIfFalse>
struct Select
{
typedef TypeIfFalse Type;
};
template <typename TypeIfTrue, typename TypeIfFalse>
struct Select<true, TypeIfTrue, TypeIfFalse>
{
typedef TypeIfTrue Type;
};
鏈鍚庯紝鍐嶆潵涓細
struct NullType;
template <typename T, typename U>
struct CommonType
{
typedef typename Select<Conversion<T, U>::exists,
U,
typename Select<Conversion<U, T>::exists,
T,
NullType>::Type
>::Type Type;
};
閭d箞 CommonType<T1, T2> 灝辨槸 T1 鍜?T2 涔嬮棿鍝釜鏄粬浠殑鍏辨湁綾誨瀷浜嗐?
嫻嬭瘯錛?
int main()
{
CommonType<int, double>::Type m = 0;
return 0;
}
璋冭瘯錛岀‘璁?m 鏄?double 鐨勩備絾鏄弽榪囨潵鍐?CommonType<double, int>::Type m = 0;錛宮 鍗存槸 int 鐨勩?
榪欒鏄庤繖濂楁満鍒朵竴寮濮嬪氨鏈夐棶棰橈紝Test(U) 鍜?Test(鈥? 涓や釜閲嶈澆鍑芥暟涓紝Test(鈥? 涓嶄細鍦ㄩ渶瑕?double 杞?int 鏃惰儨鍑恒傝繖鏄涓涓棶棰樸?
絎簩涓棶棰橈紝褰撳啓涓嬪涓嬩唬鐮佺殑鏃跺欙細
template <typename T1, typename T2>
CommonType<T1, T2>::Type Min(T1 t1, T2 t2)
{
return (t1 < t2 ? t1 : t2);
}
緙栬瘧鏃犳硶閫氳繃銆?u>鍘熷洜鏄繑鍥炵被鍨嬩腑鐨?CommonType 涓殑妯℃澘鍙傛暟 T銆乁 鏃犳硶鎺ュ彈姝ゆ椂榪樹笉鑳界‘瀹氱殑 T1銆乀2銆?/u>
(鏇存錛氫笉鏄繖涓師鍥狅紝榪斿洖綾誨瀷鍓嶅姞 typename 鍗沖彲銆傜幇鍦ㄩ棶棰樿繕鏄涓涓棶棰樸?
璇鋒暀鍚勪綅錛屾湁娌℃湁浠涔堟柟娉曞仛鍒幫紵嬈㈣繋鎸囨暀~
C++ 0x 涓氨鑳藉緢鏂逛究鍋氬埌浜嗭細
template <typename T1, typename T2>
auto Min(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return (t1 < t2 ? t1 : t2);
}
int main()
{
int a = 2;
double b = 1.0;
auto m = Min(a, b);
return 0;
}
涓嶇煡澶у鏈夋病鏈夊彂鐜幫紝褰撲嬌鐢?VS 鏉ヨ皟璇曚唬鐮佺殑鏃跺欙紝閭d簺 STL 瀹瑰櫒鐨勪俊鎭細浠ユ瘮杈冪湅寰楁噦鐨勬柟寮忔樉紺哄嚭鏉ワ細
鑰屾垜浠嚜宸卞啓鐨勶紝瀹冨彧鑳芥寜鐓ф暟鎹垚鍛樻潵鏄劇ず錛屽鏋滄暟鎹粨鏋勭◢寰鏉傜偣錛岀湅榪欎簺鐩存帴鏄劇ず鐨勫唴瀹瑰緱鍒扮殑鏈夌敤淇℃伅灝變細寰堝皯浜嗭細
閭d箞錛屾槸鍚︽湁鍔炴硶鑳借 IDE 鎸夌収鎴戜滑璁炬兂鐨勬柟寮忔潵鏄劇ず鏁版嵁鍛紵絳旀鏄偗瀹氱殑銆傝繖涓厤緗氨浣嶄簬 autoexp.txt 涓紙鍏蜂綋璺緞涓?X:\Program Files\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\autoexp.dat錛屽鏋滄槸 VS 涓嶅悓鐗堟湰錛屸淢icrosoft Visual Studio 10.0鈥濅腑鐨勭増鏈彿鎹㈡垚鍏朵粬鐨勫嵆鍙紝VS 2005 浠ヤ笂鐗堟湰閮芥敮鎸侊級銆?/p>
鍦ㄩ噷闈㈡悳绱?vector錛屽彲浠ユ壘鍒頒綔鐢ㄤ簬 vector 鐨勮皟璇曚俊鎭樉紺烘柟寮忕殑璇彞錛?/p>
std::vector<*>{ children ( |
榪欎釜璇硶鐨勮緇嗗畼鏂硅鏄庡ソ鍍忔病鏈夛紝涓嶈繃澶т綋涓婂彲浠ョ寽鍑烘潵銆?/p>
絎竴琛?std::vector<*> 鏄被鍨嬶紝璇存槑涓嬮潰鐨勫唴瀹歸拡瀵?std::vector錛屽茍涓旈傜敤浜庝換鎰忔ā鐗堝弬鏁般傜揣鎺ョ潃鏄竴涓ぇ鎷彿鎷搗鏉ョ殑孌佃惤銆?/p>
preview 寮濮嬬殑閭d竴孌佃〃紺哄綋璇ュ彉閲忓崟琛屾樉紺虹殑鏃跺欒濡備綍鏄劇ず錛屼篃灝辨槸涓嬪浘絎簩鍒楃殑鏍峰瓙錛?br>
IDE 浼氫緷嬈℃樉紺?preview(#( 鈥?)) 鎷彿鍐呯殑浠ラ楀彿鍒嗛殧鐨勫唴瀹癸紝鍔犲紩鍙風殑浼氬師鏍鋒樉紺猴紝鍙橀噺鐢?$e 寮曠敤錛堝皢 $e 瑙嗕負璇ョ被鍨嬬殑涓涓彉閲忥級銆?/p>
闄や簡鐩存帴寮曞彿錛屽彉閲忕殑榪愮畻緇撴灉澶栵紝榪欓噷榪樺彲浠ュ啓涓浜涢珮綰х偣鐨勭帺鎰忓効錛屽 #array錛?list錛?tree銆?/p>
#array 鐨勬牸寮忎負錛?br>#array(
expr: 鈥?,
size: 鈥?br>)
鍏朵腑 expr 閲屽彲浠ヤ嬌鐢?$i錛?i 涓哄厓绱?index錛宻ize 琛ㄧず鍏冪礌涓暟銆傛渶緇堢殑緇撴灉涓猴細
$i=0鏃剁殑expr, $i=1鏃剁殑expr, 鈥? $i=size鏃剁殑expr銆?/p>
鍋囪鏈変竴涓粨鏋勶細
struct Vector
{
int *pData;
int nCount;
};
鍏朵腑 p 鏄寚鍚戜竴鍧?count 涓?int 鐨勫唴瀛樸傚鏋滆渚濇鏄劇ず榪?count 涓暟瀛楋紝preview 涓簲璇ュ啓錛?br>preview (
#(
#array(
expr: $e.pData[$i],
size: $e.nCount
)
)
)
#list 鐨勬牸寮忎負錛?br>#list(
head: 鈥?,
size: 鈥?,
next: 鈥?br>) : 鈥?br>鍏朵腑 head 鏄寚鍚戠涓涓?Node 鐨勬寚閽堬紝size 琛ㄧず鍏冪礌涓暟錛宯ext 琛ㄧず Node 涓寚鍚戜笅涓涓?Node 鐨勫垎閲忓悕錛屾渶鍚庡啋鍙峰悗闈㈣繕瑕佸啓涓涓?Node 涓殑鍊煎垎閲忥紝涔熷氨鏄鏄劇ず鐨勯偅涓彉閲忋?/p>
鍋囪鏈夌粨鏋勶細
struct ListNode
{
int nData;
ListNode *pNext;
};
struct List
{
ListNode *pHead錛?br> int nCount;
};
preview 鐨勫啓娉曚負錛?br>preview (
#(
#list(
head: $e.pHead,
size: $e.nCount,
next: pNext
) : $e.nData // 娉ㄦ剰錛岃繖閲岀殑 $e 浠h〃 ListNode錛屼笂闈袱涓?$e 閮戒唬琛?List
)
)
#tree鐨勬牸寮忎負
#tree(
head: 鈥?
left: 鈥?
right: 鈥?
size: 鈥?br>) : 鈥?br>鍏朵腑 head 鏄寚鍚戞牴鑺傜偣鐨勬寚閽堬紝left 鍜?right 鍒嗗埆鏄寚鍚戝乏鍙沖瓙鏍戠殑鍒嗛噺鍚嶏紝size 琛ㄧず鍏冪礌涓暟錛屾渶鍚庡啋鍙峰悗闈㈠啓鑺傜偣涓殑鍊煎垎閲忋侷DE浼氬鏁存5鏍戝仛涓簭閬嶅巻銆?/p>
鍋囪鏈夌粨鏋勶細
struct TreeNode
{
int nData;
TreeNode *pLeft;
TreeNode *pRight;
};
struct Tree
{
TreeNode *pRoot;
int nCount;
};
preview 鐨勫啓娉曚負錛?br>preview (
#(
#tree(
head: $e.pRoot,
left: pLeft,
right: Right,
size: $e.nCount
) : $e.nData // 娉ㄦ剰錛岃繖閲岀殑 $e 浠h〃 TreeNode錛屼笂闈袱涓?$e 閮戒唬琛?Tree
)
)
preview 鐨勬牸寮忓氨鍒版銆傛帴涓嬫潵鏄?children錛屽畠鐢ㄤ簬鎻忚堪鐐瑰嚮鍙橀噺宸﹁竟鐨勫姞鍙峰悗錛屽睍寮鐨勫唴瀹規庝箞鏄劇ず錛屽鍥撅細
IDE 浼氫緷嬈℃樉紺?children(#( 鈥?)) 鎷彿鍐呯殑浠ラ楀彿鍒嗛殧鐨勫唴瀹癸紝姣忎釜鏄劇ず涓轟竴琛屻傚垰鎵嶇殑 #array, #list, #tree 閮藉彲浠ョ敤錛屼細鏄劇ず鎴愮涓鍒楃儲寮曠浜屽垪鍊肩殑鏍峰瓙銆?br>鍙﹀鍙互鐢?#(first, second) 鐨勬牸寮忥紝first 浼氬師鏍鋒樉紺哄湪絎竴鍒楋紝second 浼氭眰鍊兼樉紺哄湪絎簩鍒椼?/p>
浜嗚В浠ヤ笂榪欎簺鍐呭錛屾垜浠凡緇忓彲浠ラ拡瀵?STL 鐨勯偅浜涙暟鎹粨鏋勫仛鑷畾涔夋樉紺轟簡錛屽涓浜涘埆鐨勬暟鎹粨鏋勪綔綆鍗曠殑鑷畾涔夋樉紺轟篃涓嶉毦銆?/p>
鏈鍚庣粰涓晥鏋滃浘錛屽畾涔変簡鎴戣嚜宸辯殑閭d簺瀹瑰櫒鐨勬樉紺烘柟寮忋傛庝箞鏍鳳紝鐪嬩笂鍘諱竴瀹氭瘮寮澶寸粰鍑虹殑閭d釜鍐峰啺鍐扮殑鏍峰瓙濂藉緢澶氬惂錛?/p>
C++ 涓?Function 瀵硅薄鐨勫疄鐜幫紙涓婏級
C++ 涓?Function 瀵硅薄鐨勫疄鐜幫紙涓嬶級
涓婄瘒涓紝鎴戜滑瀹炵幇浜嗕竴涓敮鎸?R () 鍨嬪嚱鏁扮殑 Function銆傝ˉ鍏呰鏄庝竴涓嬶紝鍦ㄦ垜浠鎴愬憳鍑芥暟鐨勬敮鎸佷腑錛屾垜浠槸榪欐牱瀹氫箟鐨勶細
template <typename R, typename T>
class MemberFunction0 : public FunctionBase0<R>
{
private:
R (T::*m_pMemFun)();
T *m_pObj;
};
Loki 鐗規剰鍦ㄨ憲浣滀腑鎻愰啋鎴戜滑錛岃繖閲岀殑 T 鏈濂戒笉瑕佹槸鍑芥暟綾誨瀷錛屾敼涓哄嚱鏁版寚閽堢被鍨嬶紝濡傛璇ョ被鐨勬敮鎸佽寖鍥村皢鎵╁ぇ銆傚涓嬶細
template <typename R, typename P, typename T>
class MemberFunction0 : public FunctionBase0<R>
{
public:
R Invoke()
{
return (m_pObj->*m_pMemFun)();
}
public:
MemberFunction0(P pObj, R (T::*pMemFun)())
: m_pObj(pObj), m_pMemFun(pMemFun)
{
}
private:
R (T::*m_pMemFun)();
P m_pObj;
};
浜庢槸錛孭 鍜?T 鐨勫叧緋諱笉閭d箞绱у瘑浜嗭紝P 涓嶄竴瀹氶潪瑕?T* 涓嶅彲錛屼篃鍙互鏄濡?SmartPtr<T> 涔嬬被鐨勭帺鎰忓効銆傚師鏈彧鏀寔浼犲叆涓涓璞″拰璇ュ璞$殑鎴愬憳鍑芥暟鐨勶紝鐜板湪鍙樻垚浼犲叆涓涓叿鏈夋寚閽堟蹇電殑涓滀笢鍜屼竴涓垚鍛樺嚱鏁幫紝鍙榪欎釜鈥滄寚閽堚濅嬌鐢ㄨ繍綆楃 鈥?gt; 鍘昏皟鐢ㄩ偅涓垚鍛樺嚱鏁板悎涔庤娉曞嵆鍙?/p>
鎺ヤ笅鏉ワ紝鎴戜滑鏉ユ墿灞曡繖涓?Function錛屼互鏀寔鎷ユ湁鏁扮洰鍦ㄧ粰瀹氫笂闄愬唴鐨勪換鎰忓弬鏁扮殑鍑芥暟銆?/p>
鎴戜滑鍏堟潵鎵嬪伐鍐欎竴涓嬶紝鐪嬬湅濡備綍鏀寔甯︿竴涓弬鏁扮殑鍑芥暟銆傞鍏堝畾涔変竴涓櫄鍩虹被錛?/p>
template <typename R, typename T0>
class FunctionBase1
{
public:
virtual R Invoke(T0) = 0;
virtual ~FunctionBase1() {}
};
瀹炵幇涓や釜鐗堟湰錛屽垎鍒敮鎸侀潪鎴愬憳鍑芥暟鍜屾垚鍛樺嚱鏁幫細
template <typename R, typename T0, typename T>
class Function1 : public FunctionBase1<R, T0>
{
public:
R Invoke(T0 v0)
{
return m_Fun(v0);
}
public:
Function1(const T &fun)
: m_Fun(fun)
{
}
private:
T m_Fun;
};
template <typename R, typename P, typename T, typename T0>
class MemberFunction1 : public FunctionBase1<R, T0>
{
public:
R Invoke(T0 v0)
{
return (m_pObj->*m_pMemFun)(v0);
}
public:
MemberFunction1(P pObj, R (T::*pMemFun)(T0))
: m_pObj(pObj), m_pMemFun(pMemFun)
{
}
private:
R (T::*m_pMemFun)(T0);
P m_pObj;
};
澧炲姞涓涓嚱鏁板紩鐢ㄨ悆鍙栫殑鍋忕壒鍖栫増鏈細
template <typename RetType, typename T0>
struct FunctionTraits<RetType (T0)>
{
typedef RetType (&ParamType)(T0);
};
澧炲姞涓涓?Function 綾葷殑鍋忕壒鍖栫増鏈細
template <typename R, typename T0>
class Function<R (T0)>
{
public:
template <typename T>
Function(const T &fun)
: m_pFunBase(new Function1<R, T0, typename FunctionTraits<T>::ParamType>(fun))
{
}
template <typename P, typename T>
Function(P pObj, R (T::*pMemFun)(T0))
: m_pFunBase(new MemberFunction1<R, P, T, T0>(pObj, pMemFun))
{
}
~Function()
{
delete m_pFunBase;
}
R operator ()(T0 v0)
{
return m_pFunBase->Invoke(v0);
}
private:
FunctionBase1<R, T0> *m_pFunBase;
};
鐜板湪錛屾垜浠彲浠ヨ窇涓涓嬫祴璇曚唬鐮佷簡錛?/p>
Function<int (int)> f1(&intfun1);
Function<int (int)> f1_(intfun1);
Function<int (int)> f2(intfunctor1);
Function<int (int)> f3(&test, &Test::intmem1);
f1(1);
f1_(1);
f2(2);
f3(3);
褰撶劧錛寁oid 鍑芥暟涔熸槸鏀寔鐨勩?/p>
瑙傚療涓婇潰鐨勮繖浜涗唬鐮侊紝鍜屾垜浠湪涓婁竴綃囦腑鐨勪唬鐮侀珮搴︿竴鑷達紝涓嶅悓鐨勬槸閭d簺妯$増鍙傛暟銆佸亸鐗瑰寲鍙傛暟銆佸嚱鏁拌皟鐢ㄥ弬鏁扮瓑鍦版柟銆?/p>
鍋囧鏈夎繖涔堜竴緇勫畯錛?br>TYPENAME_DECLARE(n) 琚畾涔変負 typename T0, typename T1, 鈥? typename Tn
TYPENAME_LIST(n) 琚畾涔変負 T0, T1, 鈥? Tn
TYPENAME_VARIABLE(n) 琚畾涔変負 T0 v0, T1 v1, 鈥? Tn vn
VARIABLE_LIST(n) 琚畾涔変負 v0, v1, 鈥? vn
閭d箞鎴戜滑鍙互浣跨敤涓涓?n 灝卞啓鍑烘敮鎸佹墍鏈夊叿鏈夊弬鏁扮殑鍑芥暟鐨?Function 浜嗐傛垜浠姏寮冩帀涓婇潰鐨?1 緋誨垪鐨勬墍鏈夌被錛屼粎淇濇寔涓婄瘒鐣欎笅鏉ョ殑浠g爜錛岀劧鍚庡埄鐢ㄤ笂闈?4 涓畯灝嗘墍鏈夋暟瀛楀熬宸村幓鎺夛紝浜庢槸浠g爜鍙樻垚錛?/p>
template <typename R, TYPENAME_DECLARE(n)>
class FunctionBase_##n
{
public:
virtual R Invoke(TYPENAME_LIST(n)) = 0;
virtual ~FunctionBase_##n() {}
};
template <typename R, TYPENAME_DECLARE(n), typename T>
class Function_##n : public FunctionBase_##n<R, TYPENAME_LIST(n)>
{
public:
R Invoke(TYPENAME_VARIABLE(n))
{
return m_Fun(VARIABLE_LIST(n));
}
public:
Function_##n(const T &fun)
: m_Fun(fun)
{
}
private:
T m_Fun;
};
template <typename R, typename P, typename T, TYPENAME_DECLARE(n)>
class MemberFunction_##n : public FunctionBase_##n<R, TYPENAME_LIST(n)>
{
public:
R Invoke(TYPENAME_VARIABLE(n))
{
return (m_pObj->*m_pMemFun)(VARIABLE_LIST(n));
}
public:
MemberFunction_##n(P pObj, R (T::*pMemFun)(TYPENAME_LIST(n)))
: m_pObj(pObj), m_pMemFun(pMemFun)
{
}
private:
R (T::*m_pMemFun)(TYPENAME_LIST(n));
P m_pObj;
};
template <typename RetType, TYPENAME_DECLARE(n)>
struct FunctionTraits<RetType (TYPENAME_LIST(n))>
{
typedef RetType (&ParamType)(TYPENAME_LIST(n));
};
template <typename R, TYPENAME_DECLARE(n)>
class Function<R (TYPENAME_LIST(n))>
{
public:
template <typename T>
Function(const T &fun)
: m_pFunBase(new Function_##n<R, TYPENAME_LIST(n), typename FunctionTraits<T>::ParamType>(fun))
{
}
template <typename P, typename T>
Function(P pObj, R (T::*pMemFun)(TYPENAME_LIST(n)))
: m_pFunBase(new MemberFunction_##n<R, P, T, TYPENAME_LIST(n)>(pObj, pMemFun))
{
}
~Function()
{
delete m_pFunBase;
}
R operator ()(TYPENAME_VARIABLE(n))
{
return m_pFunBase->Invoke(VARIABLE_LIST(n));
}
private:
FunctionBase_##n<R, TYPENAME_LIST(n)> *m_pFunBase;
};
褰撶劧涓婇潰榪欐牱瀛愮殑浠g爜鏄病娉曡窇鐨勫挴銆傚鏋滄垜浠皢鏁存浠g爜瀹氫箟涓轟竴涓畯 BODY(n)錛岀劧鍚庣敤綾諱技鍒氭墠鍥涗釜瀹忕殑鏂瑰紡瀹氫箟瀹?FUNCTION_IMPLEMENT(n)錛屼嬌寰楀畠鐨勫惈涔変負 BODY(0), BODY(1), 鈥? BODY(n)錛屾墍鏈夊伐浣滃氨閮藉畬鎴愪簡銆傛渶鍚庡彧闇瑕佷涪涓嬩竴鍙?FUNCTION_IMPLEMENT(20)錛屽氨鍙互鏀寔 0 鍒?21 涓弬鏁頒簡銆?/p>
鏈鍚庡綊緇撲負錛屽浣曚嬌鐢ㄥ畯鎼炲嚭鈥淭0, T1, 鈥? Tn鈥?鐨勫艦寮忋?/p>
鏆村姏鐐癸紝鎴戜滑鍙互榪欐牱錛?/p>
#define T_0 T0
#define T_1 T_0, T1
#define T_2 T_1, T2
#define T_3 T_2, T3
#define T_4 T_3, T4
#define T_5 T_4, T5
#define T_6 T_5, T6
#define T_7 T_6, T7
#define T_8 T_7, T8
#define T_9 T_8, T9
#define T(n) T_##n
榪欐牱瀛愶紝瀵逛簬涓婇潰鍥涗釜瀹忓彲浠ワ紝浣嗘槸瀵逛簬鏈鍚庣殑 X(n)錛屼漢宸ヤ唬鐮侀噺榪樻槸澶ぇ浜嗐傚棷錛焁(n)錛熷錛岃繖涓?X錛屽繀欏誨湪 _1銆乢2銆乢3 緋誨垪瀹忛噷闈㈠崰鎹竴涓弬鏁板湴浣嶏紝榪欐牱鎵嶆湁閭d箞涓鐐圭偣鎵╁睍鎬с傝冭檻鎹㈡垚榪欐牱錛?/p>
#define REP_0(macro, n) macro(0)
#define REP_1(macro, n) REP_0(macro, n), macro(1)
#define REP_2(macro, n) REP_1(macro, n), macro(2)
#define REP_3(macro, n) REP_2(macro, n), macro(3)
#define REP_4(macro, n) REP_3(macro, n), macro(4)
#define REP_5(macro, n) REP_4(macro, n), macro(5)
#define REP_6(macro, n) REP_5(macro, n), macro(6)
#define REP_7(macro, n) REP_6(macro, n), macro(7)
#define REP_8(macro, n) REP_7(macro, n), macro(8)
#define REP_9(macro, n) REP_8(macro, n), macro(9)
#define REP(macro, n) REP_##n(macro, n)
鐒跺悗錛?/p>
#define TYPENAME_LIST_PATTERN(n) T##n
#define TYPENAME_LIST(n) REP(TYPENAME_LIST_PATTERN, n)
榪欎釜 TYPENAME_LIST 灝辨槸絎﹀悎涓婃枃瑕佹眰鐨勫畯銆傛帴涓嬫潵濡傛硶鐐埗鍏朵綑涓変釜錛?/p>
#define TYPENAME_DECLARE_PATTERN(n) typename T##n
#define TYPENAME_DECLARE(n) REP(TYPENAME_DECLARE_PATTERN, n)
#define TYPENAME_VARIABLE_PATTERN(n) T##n v##n
#define TYPENAME_VARIABLE(n) REP(TYPENAME_VARIABLE_PATTERN, n)
#define VARIABLE_LIST_PATTERN(n) v##n
#define VARIABLE_LIST(n) REP(VARIABLE_LIST_PATTERN, n)
鏈鍚庯紝鎴戜滑鍦?#define FUNCTION_IMPLEMENT(n) REP(BODY, n) 涓繕瀛樺湪涓鐐圭偣闂銆傚洜涓?BODY 涓細鍚湁 TYPENAME_DECLARE 涔嬬被鐨勫畯鐨勪嬌鐢紝鑰?TYPENAME_DECLARE 姝f槸浣跨敤 REP 瀹氫箟鐨勩傝繖娑夊強鍒板畯鐨勯掑綊灞曞紑錛孋++棰勫鐞嗗櫒鐨勮鍒欐槸錛岄亣鍒拌繖鏍風殑鎯呭喌灝卞仠姝㈠睍寮銆傛瘮濡傦紝鎴戜滑 瀹氫箟 BODY(n) 涓?TYPENAME_DECLARE(n)錛屼簬鏄?FUNCTION_IMPLEMENT(2) 浼氳灞曟垚錛?/p>
REP(TYPENAME_DECLARE_PATTERN, 0), REP(TYPENAME_DECLARE_PATTERN, 1), REP(TYPENAME_DECLARE_PATTERN, 2)
涓婇潰鐨?REP 涓嶄細琚戶緇睍寮浜嗐?/p>
涓烘錛屼竴涓笉澶仾鏄庣殑鍔炴硶灝辨槸錛屽啀瀹氫箟涓緇?REP2銆傚棷錛屾槸涓姙娉曪紝灝辮繖涔堝姙鍚с傚彟澶栨垜浠垰鎵嶇殑 REP 緋誨垪娌℃湁灝嗗垎闅旂浣滀負鍙傛暟錛岄粯璁や嬌鐢ㄩ楀彿錛岃屾渶鍚庝竴涓嶇殑 FUNCTION_IMPLEMENT 鐨勯噸澶嶄腑鏄笉鑳界敤閫楀彿鐨勩傝冭檻鎻愬彇鍑烘潵浣滀負鍙傛暟銆傛渶鍚庢垜浠殑鎵闇瑕佺殑瀹忕郴緇熸槸錛?/p>
#define NIL
#define COMMA ,
#define REP_0(macro, splitter, n) macro(0)
#define REP_1(macro, splitter, n) REP_0(macro, splitter, n) splitter macro(1)
#define REP_2(macro, splitter, n) REP_1(macro, splitter, n) splitter macro(2)
#define REP_3(macro, splitter, n) REP_2(macro, splitter, n) splitter macro(3)
#define REP_4(macro, splitter, n) REP_3(macro, splitter, n) splitter macro(4)
#define REP_5(macro, splitter, n) REP_4(macro, splitter, n) splitter macro(5)
#define REP_6(macro, splitter, n) REP_5(macro, splitter, n) splitter macro(6)
#define REP_7(macro, splitter, n) REP_6(macro, splitter, n) splitter macro(7)
#define REP_8(macro, splitter, n) REP_7(macro, splitter, n) splitter macro(8)
#define REP_9(macro, splitter, n) REP_8(macro, splitter, n) splitter macro(9)
#define REP(macro, splitter, n) REP_##n(macro, splitter, n)
#define REP2_0(macro, splitter, n) macro(0)
#define REP2_1(macro, splitter, n) REP2_0(macro, splitter, n) splitter macro(1)
#define REP2_2(macro, splitter, n) REP2_1(macro, splitter, n) splitter macro(2)
#define REP2_3(macro, splitter, n) REP2_2(macro, splitter, n) splitter macro(3)
#define REP2_4(macro, splitter, n) REP2_3(macro, splitter, n) splitter macro(4)
#define REP2_5(macro, splitter, n) REP2_4(macro, splitter, n) splitter macro(5)
#define REP2_6(macro, splitter, n) REP2_5(macro, splitter, n) splitter macro(6)
#define REP2_7(macro, splitter, n) REP2_6(macro, splitter, n) splitter macro(7)
#define REP2_8(macro, splitter, n) REP2_7(macro, splitter, n) splitter macro(8)
#define REP2_9(macro, splitter, n) REP2_8(macro, splitter, n) splitter macro(9)
#define REP2(macro, splitter, n) REP2_##n(macro, splitter, n)
#define TYPENAME_DECLARE_PATTERN(n) typename T##n
#define TYPENAME_DECLARE(n) REP(TYPENAME_DECLARE_PATTERN, COMMA, n)
#define TYPENAME_LIST_PATTERN(n) T##n
#define TYPENAME_LIST(n) REP(TYPENAME_LIST_PATTERN, COMMA, n)
#define TYPENAME_VARIABLE_PATTERN(n) T##n v##n
#define TYPENAME_VARIABLE(n) REP(TYPENAME_VARIABLE_PATTERN, COMMA, n)
#define VARIABLE_LIST_PATTERN(n) v##n
#define VARIABLE_LIST(n) REP(VARIABLE_LIST_PATTERN, COMMA, n)
#define FUNCTION_IMPLEMENT(n) REP2(BODY, NIL, n)
鏈鍚庯紝瀹氫箟涓涓?FUNCTION_IMPLEMENT(5)錛屽氨鍙互鏀寔鍒?6 涓弬鏁頒簡銆備負浜嗘敮鎸佹洿澶氬弬鏁幫紝鎶婁笂闈㈢殑 REP 浠ュ強 REP2 緋誨垪澶氬畾涔変竴鐐癸紝姣斿鍒?50錛岄偅涔?FUNCTION_IMPLEMENT 鐨勬嫭鍙蜂腑灝卞彲浠ュ~ 50 浠ュ唴鐨勪換鎰忔暟浜嗐傝冭檻鍒板畯灞曞紑瀵圭紪璇戦熷害鐨勫獎鍝嶏紝浠ュ強瀹為檯搴旂敤涓嚱鏁板弬鏁扮殑涓暟錛屽畾涓?20 宸﹀彸姣旇緝鍚堥傘?/p>
鍒拌繖閲岋紝鎴戜滑鐨凢unction宸茬粡瀹炵幇浜嗛鏈熺洰鏍囥傛帴涓嬫潵鎴戞湰鏉ユ兂璇磋 TypeList 鐨勩傚彲鏄幇鍦ㄥ彂鐜版病鏈?TypeList錛孎unction 璺戠殑閫氾紱鏈変簡 TypeList錛孎unction 涔熶笉鑳藉啓鐨勬紓浜灝戯紝铏借閭d簺閲嶅閮ㄥ垎鏈変竴瀹氱殑鍑忓皯銆侺oki 鐨?Functor 鐨勫弬鏁扮被鍨嬫槸涓涓繑鍥炲肩被鍨嬪姞涓婁竴涓?TypeList錛屾槸鐢辯敤鎴風洿鎺ヤ紶鍏?TypeList 鐨勶紝涓嶇敤鐢辨暎鐨勭被鍨嬬粍鍚堝嚭涓涓猅ypeList錛堜絾榪樻槸瑕佷粠TypeList涓悆鍙栧悇涓弬鏁扮被鍨嬶級錛屽洜姝ょ敤鍦ㄤ粬閭i噷鐪嬩笂鍘葷編濡欎竴鐐圭偣銆傚綋鐒訛紝Loki 涔熷湪 Functor 澶栧ご鍖呬簡涓灞?Function錛屼互鏀寔鍑芥暟絳懼悕浣滀負妯$増鍙傛暟鐨勪嬌鐢ㄦ柟寮忋傛湁涓鐐逛笉綆楁敼瑙傜殑鏀硅鏄紝鐢ㄤ簡 TypeList 浠ュ悗錛屽氨涓嶄細鍐嶆湁 FunctionBase_1, FunctionBase_2 榪欐牱鐨勭帺鎰忓効浜嗭紝鍙栬屼唬涔嬬殑鏄竴涓粺涓鐨?FunctionBase 澶栧姞璁稿鍋忕壒鍖栫増鏈紝Function* 鍜?MemberFunction* 鍙互鍒嗗埆緇熶竴涓轟竴涓紝浣嗘槸姣忎竴涓噷澶撮兘闇瑕佸疄鐜?N 涓?Invoke銆傚姞涓婄瘒騫呭叧緋伙紝鎴戞兂榪欓噷灝變笉璇磋繖涓?TypeList 浜嗐?/p>
浠g爜娓呭崟澶暱浜嗭紝灝變笉璐翠簡錛屾湁鎰忚呰嚜鐒惰兘鍑戣搗鏉ャ傛垜鐩墠鍦?xlLib 涓殑鏈緇堝疄鐜拌 xlFunction.h銆?/p>
鍏充簬瀹忥紝鎴戜笉鐭ラ亾鍙互鎬庢牱鏀硅繘銆侭OOST_PP_REPEAT 璨屼技鍙互璋冪敤鑷韓錛熶笉鐭ラ亾濡備綍瀹炵幇鐨勶紝姹傛寚鏁欍傚彟澶?a href="http://www.shnenglu.com/vczh" target="_blank">@vczh璨屼技璇粹滃疄鐜頒簡涓闂ㄥ彲浠ヨ嚜宸遍掑綊鑷繁鍜屽唴緗垪琛ㄥ鐞嗙殑鍙︿竴涓畯鈥濓紝姹傚垎浜憖姹傚垎浜?/p>
2010-01-18 琛ュ厖錛氬皢鏈澶栧眰 Function 鐨勬瀯閫犲嚱鏁頒腑鐨?const T & 鐩存帴鏀逛負 T錛屽茍涓旀姏寮?FunctionTraits錛屽嚱鏁板疄浣撶被鍨嬪皢鍦ㄤ紶閫掕繃紼嬩腑鐩存帴閫鍖栦負鍑芥暟鎸囬拡錛岃繖鏍峰氨鑳界壒鍖栧嚭姝g‘鐨?FunctionHandler銆傚悓鏃跺甫鏉ュ彟涓鐐瑰獎鍝嶏細濡傛灉浼犲叆 Functor錛屽瓧闈笂灝嗗涓嬈℃嫹璐濆姩浣溿傛姏寮榪欎竴鐐瑰井灝忕殑鎬ц兘鏉ヨ錛岃繖姣斿垰鎵嶇殑 FunctionTraints 瑕佸ソ寰楀浜嗐?/strong>
C++ 涓?Function 瀵硅薄鐨勫疄鐜幫紙涓婏級
C++ 涓?Function 瀵硅薄鐨勫疄鐜幫紙涓嬶級
璧峰洜鍦?a href="http://www.shnenglu.com/Streamlet/archive/2011/01/16/138609.html" target="_blank">涓婁竴綃?/a>宸茬粡璇磋繃浜嗐傜幇鍦ㄨ鎴戜滑鐩存帴榪涘叆涓婚銆傛湰鏂囩殑鐩爣鏄紝璁╀互涓嬩唬鐮佽兘欏哄埄璺戣搗鏉ワ細
int intfun0()
{
return 1;
}
struct _intfunctor0
{
int operator()()
{
return 2;
}
} intfunctor0;
struct Test
{
int intmem0()
{
return 3;
}
} test;
int main()
{
Function<int ()> f1(&intfun0);
Function<int ()> f1_(intfun0);
Function<int ()> f2(intfunctor0);
Function<int ()> f3(&test, &Test::intmem0);
f1();
f1_();
f2();
f3();
return 0;
}
闄や簡涓婅堪渚嬪瓙涓樉紺虹殑錛岃繕瑕佹敮鎸佹湁榪斿洖鍊肩殑鍑芥暟鍜屾病榪斿洖鍊肩殑鍑芥暟錛屼互鍙婃湁0涓?涓?涓佲︹︺丮AX 涓弬鏁扮殑鍑芥暟錛屽弬鏁扮被鍨嬫棤闄愬埗銆傛渶鍚庡疄鐜扮殑 Function 瀵硅薄浠呬粎鍙互鎵ц灝卞ソ銆傦紙鑷充簬鏄惁鍙嫹璐濄佹槸鍚﹀彲鍒ゆ柇鐩哥瓑 絳夐棶棰橈紝閮芥槸灝忎簨錛屾湰鏂囨殏涓嶈冭檻銆傦級鏈鍚庯紝Bind 姒傚康涔熶笉鍦ㄦ湰鏂囪璁鴻寖鍥翠箣鍐呫?/p>
瀵逛簬榪欎釜闂錛屾垜浠竴寮濮嬭冭檻鐨勫彲鑳芥槸鎬庢牱緇熶竴涓夌涓嶅悓褰㈠紡銆傛湁涓や釜閫夋嫨錛岀涓錛屼嬌鐢?C++ 鐨勫鎬佹満鍒訛紝鏈鍚庣粺涓鍒板熀綾繪寚閽堢殑綾誨瀷錛涚浜岋紝鍏佽綾誨唴閮ㄦ湁鍐椾綑鍙橀噺浠ュ強蹇呰鐨?Flag錛岀敤浜庡垽鏂槸鍝褰㈠紡鐨勫嚱鏁幫紝瑕佸浣曟墽琛屻傝繖鏍風湅璧鋒潵錛岀涓縐嶆柟妗堟瘮絎簩縐嶇埥涓鐐廣備簬鏄紝鏈鍒濇兂鍒扮殑瀹炵幇鏈夊彲鑳芥槸榪欐牱鐨勶細
鍏堝畾涔変竴涓櫄鍩虹被錛?/p>
template <typename R>
class FunctionBase0
{
public:
virtual R Invoke() = 0;
virtual ~FunctionBase0() {}
};
鐒跺悗瀹炵幇涓涓櫘閫氬嚱鏁?浠垮嚱鏁扮殑鐗堟湰錛?/p>
template <typename R, typename T>
class Function0 : public FunctionBase0<R>
{
public:
R Invoke()
{
return m_Fun();
}
public:
Function0(const T &fun)
: m_Fun(fun)
{
}
private:
T m_Fun;
};
榪欓噷闇瑕佽鏄庣殑鏄紝濡傛灉鏄櫘閫氬嚱鏁幫紝T浼氳鐗瑰寲鎴?R() 鎴栬?R (&)() 鎴栬?R(*)()錛屽彇鍐充簬浣跨敤鐨勬椂鍊欎紶鍏?fun 榪樻槸浼犲叆 &fun銆傛墍浠ヤ笉蹇呭彟澶栧疄鐜伴拡瀵?R(*)() 鐨勭増鏈侺oki 錛堝涓斿氨浠ヤ綔鍝佸悕縐頒箮 Loki 鐨勪綔鑰呭惂錛屼粬閭d釜鐪熷悕瀹炲湪鏄お闀匡級鍦ㄤ粬鐨勪功涓О涔嬩負鈥?font face="Consolas">鍋氫竴涓紝閫佷竴涓?/font>鈥濄備笉榪囧浜庝粬涔︿腑鎵璇寸殑錛屾垜鏈変竴涓枒鎯戙侺oki 璇翠紶鍏?fun錛屾ā鐗堝弬鏁?T 浼氳鐗瑰寲鎴?R (&)()錛屼簬鏄竴鍒囬『鍒┿傚彲鏄垜鍦ㄦ搷浣滆繃紼嬩腑鍙戠幇 T 涓鐩磋鐗瑰寲鎴?R ()錛屼簬鏄笂榪?class 涓殑 m_Fun 琚涓烘槸鎴愬憳鍑芥暟鑰屼笉鏄垚鍛樺彉閲忋備笉鐭ラ亾鏄負浠涔堬紝鏈夌煡閬撹呰涓嶅悵鎸囨暀鍝堛傚洜涓轟互涓婂師鍥狅紝鏈枃涓垜涓鐩寸敤 &fun 鐨勫艦寮忓寰呮櫘閫氬嚱鏁般?/p>
鍐嶅疄鐜頒竴涓垚鍛樺嚱鏁扮殑鐗堟湰錛?/p>
template <typename R, typename T>
class MemberFunction0 : public FunctionBase0<R>
{
public:
R Invoke()
{
return (m_pObj->*m_pMemFun)();
}
public:
MemberFunction0(T *pObj, R (T::*pMemFun)())
: m_pObj(pObj), m_pMemFun(pMemFun)
{
}
private:
R (T::*m_pMemFun)();
T *m_pObj;
};
鏈鍚庢槸涓涓寘瑁呯被銆傚鏋滀綘鍙互鎺ュ彈 Function<int> 琛ㄧず int()錛?Function<int, int> 琛ㄧず int (int)錛屸︼紝閭d箞榪欓噷娌℃湁澶氬皯鎶宸у彲璦銆俠oost 鐨勯偅涓?function 浣跨敤鐨勬槸鍑芥暟絳懼悕浣滀負妯$増鍙傛暟錛屽嵆 Function<int()>錛孎unction<int (int)> 絳夊艦寮忋傚鏋滀笉澶爺絀惰娉曪紝鍙兘浼氬儚鎴戜竴鏍鳳紝涓寮濮嬩細瀵瑰皷鎷彿閲岀殑 int (int) 涔嬬被鐨勭帺鎰忓効涓嶅お鐔熸倝錛岃寰楀緢鐗涢箋傚彲鏄簡瑙d簡浠ュ悗錛屼笉榪囨槸涓嚱鏁扮被鍨嬭屽凡錛屾病浠涔堝ぇ涓嶄簡鐨勩侺oki 鐨?Functor 鐨勪嬌鐢ㄦ柟寮忔槸 Functor<int, TYPELIST_0()>錛孎unctor<int, TYPELIST_1(int)>銆傚叾涓涓涓ā鐗堝弬鏁板緇堟槸榪斿洖鍊鹼紝絎簩涓ā鐗堝弬鏁版槸鍙傛暟綾誨瀷鍒楄〃錛孡oki 浣跨敤浜嗕粬鍒涢犵殑鐜╂剰鍎?TypeList 浣垮緱鎵鏈夊嚱鏁板弬鏁板彧鍗犱竴涓潙錛岃繖鍦ㄧ瓑涓嬬殑鏀寔澶氬弬鏁扮殑鎵╁睍涓兘澶熷甫鏉ヤ竴浜涚編瑙傘傛垜姣旇緝鍠滄 boost 鐨勪嬌鐢ㄦ柟寮忥紝璁╀嬌鐢ㄨ呯洿鎺ヤ互璇█瑙勫畾鐨勫艦寮忓~鍏ュ嚱鏁扮鍚嶏紝鑰屼笉鏄竴浜涢澶栫殑綰﹀畾錛堚滅涓涓ā鐗堝弬鏁拌〃紺鴻繑鍥炲尖濓紝鈥滅浜屼釜鍒版渶鍚庣殑妯$増鍙傛暟琛ㄧず鍙傛暟鈥濓紝鈥滅浜屼釜妯$増鍙傛暟浠?TypeList 褰㈠紡琛ㄧず鍑芥暟鍙傛暟鈥濈瓑錛夈?/p>
涓轟簡杈懼埌榪欎釜鐩爣錛屾垜浠鐜╀竴浜涘亸鐗瑰寲鎶宸с傚叧浜庡亸鐗瑰寲錛屾垜涓鐩翠互鏉ョ殑鑲ゆ祬璁よ瘑閮芥槸閿欒鐨勩傛垜鍘熶互涓猴紝瀵逛簬妯$増綾伙細
template <typename T0, typename T1>
class Foo;
鎴戝鏋滅壒鍖栧叾涓竴涓弬鏁?T1錛?/p>template <typename T0>
class Foo<T0, int>
{
}
鎴戜互涓哄彧鏈夎繖鏍鋒墠鍙亸鐗瑰寲錛屼互涓哄亸鐗瑰寲鐨勮繃紼嬫繪槸鍑忓皯妯$増鍙傛暟鐨勩傝屽疄闄呬笂錛屽彧瑕佺敤鏌愪釜/浜涚被鍨嬪崰鎹師濮嬫ā鐗堝弬鏁扮殑浣嶇疆錛屽氨鍙互浜嗐傛瘮濡傦紝瀵逛簬涓婅堪 Foo錛屾垜鍙互鐗瑰寲涓涓?class<T0, std::map<U0, U1>>錛屾秷鍘諱竴涓?T1錛岃屾柊澧?U0銆乁1錛?/p>template <typename T0, typename U0, typename U1>
class Foo<T0, std::map<U0, U1>>
{
}
鍘熸潵 T1 鐨勪綅緗 std::map<U0, U1> 鍗犳嵁浜嗭紝榪欎篃鏄亸鐗瑰寲銆傚綋鐒舵渶鍚庣殑妯$増鍙傛暟鏁伴噺涔熷彲浠ヤ笉鍙橈紝濡傦細
template <typename T0, typename U>浠ュ強
template <typename T0, typename U>鍏朵腑鍚庤呮槸瀹炵幇綾誨瀷钀冨彇鐨勪富瑕佹柟寮忋傚彧瑕佺壒鍖栦互鍚庯紝榪欎釜綾諱緷鐒跺甫鏈夎嚦灝戜竴涓ā鐗堝弬鏁幫紝灝辨槸鍋忕壒鍖栥傚鏋滄渶鍚庝駭鐢熶簡 template<> 鐨勫艦寮忥紝閭e氨鏄畬鍏ㄧ壒鍖栥?/p>
鍥炲埌鎴戜滑鍒氭墠鐨勪富棰橈紝鎴戜滑瑕佹彁渚涚粰鐢ㄦ埛鐨勬槸榪欐牱涓涓被錛?/p>
template <typename Signature>
class Function;
鍏朵腑鍙傛暟 Signature 浼氳瀹為檯鐨勫嚱鏁扮被鍨嬫墍鐗瑰寲銆備絾鏄垜浠彧鐭ラ亾鏁翠綋鐨勪竴涓?Signature 騫舵病鏈夌敤錛屾垜浠繀欏葷煡閬撹鍒嗚В寮鏉ョ殑榪斿洖鍊肩被鍨嬨佸弬鏁扮被鍨嬨備簬鏄紝寮曞叆涓涓亸鐗瑰寲鐗堟湰錛?/p>
template <typename R>
class Function<R ()>
榪欓噷浣跨敤 R () 鐗瑰寲鍘熷鐨?Signature錛屽紩鍏ヤ竴涓柊鐨勫弬鏁?R銆備簬鏄繑鍥炲肩被鍨?R 灝辮钀冨彇鍑烘潵浜嗐傚疄鐜板涓嬶細
template <typename R>
class Function<R ()>
{
public:
template <typename T>
Function(const T &fun)
: m_pFunBase(new Function0<R, T>(fun))
{
}
template <typename T>
Function(T *pObj, R (T::*pMemFun)())
: m_pFunBase(new MemberFunction0<R, T>(pObj, pMemFun))
{
}
~Function()
{
delete m_pFunBase;
}
R operator ()()
{
return m_pFunBase->Invoke();
}
private:
FunctionBase0<R> *m_pFunBase;
};
濡傛灉瀵逛笂闈㈣鐨勨滄櫘閫氬嚱鏁扮殑浣跨敤鏂瑰紡蹇呴』鏄嚱鏁版寚閽堣屼笉鏄嚱鏁版湰韜濊胯夸簬鎬錛屽彲浠ュ啀寮曞叆涓涓殑鏋勯犲嚱鏁幫細
typedef R (FunctionType)();
Function(const FunctionType &fun)
: m_pFunBase(new Function0<R, FunctionType &>(fun))
{
}
榪欓噷 FunctionType 鏄?R(&)() 綾誨瀷錛屽己鍒朵嬌鐢ㄥ畠鏉ョ壒鍖?Function0 涓殑 T銆傝鏋勯犲嚱鏁板湪閲嶈澆鍐寵涓細鍙栧緱浼樺厛鏉冧粠鑰屼嬌鏅氬嚱鏁版湰韜殑浼犲叆鎴愪負鍙兘銆備笉榪囷紝浠ュ嚱鏁版湰韜艦寮忎紶鍏ョ殑鏅氬嚱鏁頒細涓уけ涓浜涚壒鎬э紝姣斿 Function<int()> 鍙兘鎺ュ彈 int() 綾誨瀷鐨勬櫘閫氬嚱鏁拌屼笉鑳芥帴鍙?char () 鍨嬬殑鏅氬嚱鏁幫紝鍥犱負榪欑鎯呭喌涓嬩笉浼氳蛋鎴戜滑鍒氭墠鏂板畾涔夌殑鏋勯犲嚱鏁般?/p>
榪樻湁涓縐嶅仛娉曪紝灝辨槸閽堝鍏ㄥ眬鍑芥暟錛屽己鍒剁壒鍖栧嚭妯$増鍙傛暟涓哄叾寮曠敤綾誨瀷鐨勭被銆傚畾涔夊涓嬪厓鍑芥暟錛?/p>
template <typename Signature>
struct FunctionTraits
{
typedef Signature ParamType;
};
template <typename RetType>
struct FunctionTraits<RetType ()>
{
typedef RetType (&ParamType)();
};
鐒跺悗鏋勯犲嚱鏁版敼涓猴細
template <typename T>鐢ㄤ互涓婃柟娉曪紝鎵鏈夌殑鐗規ч兘涓嶄細涓㈠け銆?/p>
鍒拌繖鍎匡紝鎴戜滑鐨?Function 宸茬粡鍙互灝忚瘯鐗涘垁浜嗭細
Function<int ()> f1(&intfun0);
f1();
f1_();
f2();
f3();
涓婇潰榪欐浠g爜宸茬粡鑳藉姝e父榪愯浜嗐?/p>
鏉ワ紝緇х畫鍋氫竴涓紝閫佷竴涓?/strong>銆備笅闈㈢殑浠g爜灞呯劧涔熻兘璺戯紙voidfun0銆乿oidfunctor0銆乀est::voidmem0綾諱技int鐗堟湰瀹氫箟錛夛細
Function<void ()> f4(&voidfun0);f4();
f4_();
f5();
f6();
榪欒鏄庝簡錛屽湪綾婚噷闈㈠啓涓涓繑鍥炲間負璇ョ被鍨嬬殑鍑芥暟錛屽茍鍦ㄩ噷闈㈠啓涓?return XXX; 鐒跺悗浠?void 涓烘ā鐗堝弬鏁頒紶鍏ヨ妯$増綾伙紝鏄鍚堣娉曠殑銆傞獙璇佷竴涓嬶細
template <typename T>
class Foo
{
public:
T Bar()
{
printf("%s invoked\n", __FUNCTION__);
return T();
}
};
int main()
{
Foo<void> f1;
f1.Bar();
Foo<int> f2;
int i = f2.Bar();
return 0;
}
榪愯緇撴灉錛?/p>
Foo<void>::Bar invoked
Foo<int>::Bar invoked
鍒版涓烘錛屾垜浠凡緇忓疄鐜頒簡 0 涓弬鏁扮殑鍑芥暟鏀寔錛屼篃鍗?R () 綾誨瀷鐨勬墍鏈夊嚱鏁扮殑鏀寔銆傛帴涓嬫潵榪樿瀹炵幇瀵瑰叿鏈?1 涓? 涓? 涓洿鑷充換鎰忔湁闄愪釜鍙傛暟鐨勫嚱鏁版敮鎸併備篃璁告偍涔熷彂鐜頒簡錛屾帴涓嬫潵鐨勫伐浣滃彲浠ユ槸浣撳姏媧伙紝鎴戜滑鍙互鐓ц懌鑺︾敾鐡紝鎼炲嚭涓鍫?FunctionBaseN銆丗unctionN銆丮emberFunctionN錛屽茍鍦ㄦ渶鍚庣殑 Function 涓啀瀹炵幇 N 涓亸鐗瑰寲鐗堟湰銆傛槸錛屼笉閿欙紝澶ц嚧涓婂師鐞嗗氨鏄繖鏍楓傞檺浜庣瘒騫咃紝鎴戞兂鏆傛椂鍐欏埌榪欓噷錛屼笅綃囧皢緇х畫璋堣皥瀹忋乀ypeList錛屼互鍙婃庢牱灝戣姳鐐瑰姏姘斿疄鐜板叾浣?N 涓増鏈傛渶緇堣揪鍒扮殑鏁堟灉鏄紝鍙鏀逛竴涓畯瀹氫箟錛屽氨鍙互鎻愰珮鍙傛暟涓婇檺銆?/p>
鍦ㄦ湰鏂囨墍娑夊強鐨勫唴瀹逛腑錛屾垜姣旇緝綰犵粨鐨勬槸錛屽彲鍚﹀湪涓嶇敤澶氭佹満鍒剁殑鎯呭喌涓嬭揪鍒版瘮杈冧紭闆呯殑褰㈠紡緇熶竴錛?/p>
嬈㈣繋璁ㄨ銆?/p>