锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鑾崕鏋?/p>
GPL錛屼篃灝辨槸General Purpose Language錛屾槸鎴戜滑浣跨敤鐨勬渶澶氱殑涓綾昏璦銆備紶緇熶笂錛孏PL鐨勮娉曪紝鎴栬呯壒鎬э紝鏄浐鎬佺殑銆傜劧鑰岋紝紼嬪簭鍛橀兘鏄仾鏄庝漢錛堝嵆渚跨畻涓嶄笂“鏈鑱槑”錛屼篃綆楀緱涓?“寰堣仾鏄?#8221;鍚?)錛夛紝寰寰涓嶆効鍙楀埌璇硶鐨勬潫緙氾紝璇曞浘鎸夎嚜宸辯殑蹇冩剰“鏀歸?#8221;璇█銆傚疄闄呬笂錛屽嵆渚挎槸鏃╂湡鐨勮璦錛屼篃鎻愪緵浜嗕竴浜涘伐鍏鳳紝渚涜仾鏄庝漢浠帺寮勮娉曘傛垜鐪嬬殑絎竴鏈珻璇█鐨勪功閲岋紝灝辨湁榪欎箞涓涓緥瀛愶紝灞曠ず鍑鴻繖縐?#8220;閭伓”鐨勬墜孌碉細 棣栧厛錛屽厛鏉ョ湅涓涓嬪畯錛岃繖縐嶈繙鍙ゆ椂浠i仐鐣欎笅鏉ョ殑鎶鏈備互鍙婂畠鐨勫悗瑁旓紝ast瀹忋?br> 鍏充簬浼犵粺鐨勫畯鐨凪P鍔熻兘錛屼笂闈㈢殑浠g爜宸茬粡綆鍗曞湴灞曠ず浜嗐備絾鏄紝榪欑鍔熻兘鏄瀬鍏舵湁闄愮殑銆傚畯鏄氳繃鏂囨湰鏇挎崲鐨勫艦寮忥紝鎶婅璦涓殑涓浜涚鍙楓佹搷浣滅銆佸叧閿瓧絳夌瓑鏇挎崲鎴愬彟涓縐嶅艦寮忋傝屽浜庡鏉傜殑璇硶鏋勯犵殑鍒涘緩鏃犺兘涓哄姏銆傞棶棰樼殑鍙︿竴闈紝瀹忓甫鏉ヤ簡寰堝鍓綔鐢ㄣ傜敱浜庡畯鐨勫熀紜鏄枃鏈浛鎹紝鎵浠ュ嚑涔庝笉鍙楄娉曞拰璇箟鐨勭害鏉熴傝屼笖錛屽畯鐨勮皟璇曞洶闅撅紝閫氬父涔熶笉鍙楀懡鍚嶇┖闂寸殑綰︽潫銆傚畠甯︽潵鐨勯夯鐑︼紝寰寰澶氫簬甯︽潵鐨勫ソ澶勩?br> ast瀹忎綔涓轟紶緇熷畯鐨勫悗緇ц咃紝鍋氫簡鏀硅繘錛屼嬌寰楀畯鍙互鍦╝st錛圓bstract Syntax Tree錛夌粨鏋勪笂鎵ц璇硶鐨勫尮閰嶃傦紙榪欓噷闇瑕佹劅璋?a >TopLanguage涓婄殑Olerev鍏勶紝浠栫敤綆媧佽屽張娓呮櫚鐨勬枃瀛楋紝瀵規垜榪涜浜哸st瀹忕殑鍒濈駭鍩硅:)錛夈傝繖鏍鳳紝渚垮彲浠ュ垱閫犳柊鐨勮娉曪細 涓嬮潰錛屾垜浠洖榪囧ご錛屽啀鏉ョ湅鐪嬪彟涓縐峂P鎶鏈斺擳MP錛堝弬鑰僁avid Abrahams, Aleksey Gurtovoy鎵钁楃殑銆奀++ Template Metaprogramming銆嬶級銆傚浜嶵MP瀛樺湪棰囧浜夎錛屾敮鎸佽呰涓哄畠鎻愪緵浜嗘洿澶氱殑鍔熻兘鍜岀伒媧繪э紱鍙嶅鑰呰涓篢MP榪囦簬tricky錛岄毦浜庤繍鐢ㄥ拰璋冭瘯銆備笉綆℃庝箞鏍鳳紝TMP鐨勫嚭鐜板悜鎴戜滑灞曠ず浜嗕竴縐嶅彲鑳芥э紝鍗沖湪GPL涓畨鍏ㄥ湴榪涜MP緙栫▼鐨勫彲鑳芥с傜敱浜嶵MP鎵榪愮敤鐨勯兘鏄疌++鏈韓鐨勮璦鏈哄埗錛岃岃繖浜涙満鍒墮兘鏄浉瀹圭殑銆傛墍浠ワ紝TMP鎵鏋勫緩鐨?MP浣撶郴涓嶄細鍚孏PL鍜屽叾浠栧瓙璇█鐨勮娉曟満鍒剁浉鍐茬獊銆?br> 瀹為檯涓婏紝TMP渚濊禆浜嶤++鐨勬ā鏉垮強鍏剁壒鍖栨満鍒舵墍鏋勫緩鐨勭紪璇戞湡璁$畻浣撶郴錛屼互鍙婃搷浣滅鐨勯噸杞藉拰妯℃澘鍖栥備笅闈㈢殑浠g爜鎽樿嚜boost::spirit鐨勬枃妗o細 expr1 = integer | group; expr2 = expr1 >> *(('*' >> expr1) | ('/' >> expr1)); 榪欓噷琛ㄨ揪浜嗕竴緇凟BNF錛堣娉曠潃瀹炲彜鎬紝榪欏挶寰呬細鍎垮啀璇達級錛?gt;>浠h〃浜嗘爣鍑咵BNF鐨?#8220;followed by”錛?浠h〃浜嗘爣鍑咵BNF鐨?錛堜粠鍙寵竟縐誨埌宸﹁竟錛夛紝鎷彿榪樻槸鎷彿錛寍渚濇棫琛ㄧずUnion銆傞氳繃瀵硅繖浜涙搷浣滅鐨勯噸杞斤紝璧嬩簣浜嗗畠浠柊鐨勮涔夛紙鍗矱BNF鐨勭浉鍏寵涔夛級銆傜劧鍚庨厤鍚堟ā鏉跨殑綾誨瀷鎺ㄥ銆佺壒鍖栫瓑絳夋満鍒訛紝鍙樻垙娉曡埇鍦版瀯閫犲嚭涓涓娉曡В鏋愬櫒錛岃屼笖鏄紪璇戞椂瀹屾垚鐨勩? 灝界鍦╯pirit涓紝>>銆?銆亅絳夋搷浣滅琚尓浣滀粬鐢紝浣嗘槸鎴戜滑渚濈劧鍙互鍦ㄨ繖浜涗唬鐮佺殑鍓嶅悗宸﹀彸鎻掑叆璇稿錛歝in>> *ptrX;鐨勪唬鐮侊紝鑰屼笉浼氬紩鍙戜換浣曢棶棰樸傝繖鏄洜涓?gt;>絳夋搷浣滅鏄寜鐓т笉鍚岀殑綾誨瀷閲嶈澆鐨勶紝瀵逛簬涓嶅悓綾誨瀷鐨勫璞$殑璋冪敤錛屼細璋冪敤涓嶅悓鐗堟湰鐨勬搷浣滅閲嶈澆錛屼簰涓嶅共鎵幫紝鑰佸皯鏃犳銆? 浣嗘槸錛孴MP瀛樺湪涓や釜闂銆傚叾涓錛岄敊璇鐞嗕笉瓚熾傚鏋滄垜涓嶅皬蹇冩妸絎簩琛屼唬鐮侀敊鍐欐垚錛歟xpr1 = i | group;錛岃宨鏄竴涓猧nt綾誨瀷鐨勫彉閲忥紝閭d箞緙栬瘧鍣ㄥ線寰浼氱粰鍑轟竴浜涚█濂囧彜鎬殑閿欒銆傛棤闈炲氨鏄綾誨瀷涓嶅尮閰嶄箣綾葷殑錛屼絾鏄緢鏅︽訂銆傝繖鏂歸潰涔熸槸TMP鍙椾漢璇熺梾鐨勪竴涓富瑕佸師鍥犮傚ソ鍦–++0x涓殑concept鍙互瀵規ā鏉夸綔鍑虹害鏉燂紝騫朵笖鍦ㄨ皟鐢ㄧ偣鐩存帴緇欏嚭閿欒鎻愮ず銆傞殢鐫榪欎簺鎶鏈殑寮曞叆錛岃繖鏂歸潰闂灝嗕細寰楀埌緙撹В銆? 鍏朵簩錛屽彈鍒癈++璇硶浣撶郴鐨勭害鏉燂紝MP鏃犳硶鑷敱鍦版寜鎴戜滑涔犳儻鐨勫艦寮忓畾涔夎娉曟瀯閫犮傚墠闈㈣榪囦簡錛宻pirit鐨凟BNF璇硶涓庢爣鍑咵BNF鏈変笉灝忕殑宸紓錛岃繖瀵逛簬spirit鐨勪嬌鐢ㄩ犳垚浜嗕笉渚褲傚悓鏍鳳紝濡傛灉璇曞浘榪愮敤TMP鍦–++涓瀯閫犳洿楂樼駭鐨凞SL搴旂敤錛岃濡備竴縐嶇敤浜庤璐︾殑甯愬姟澶勭悊璇█錛屽皢浼氶亣鍒版洿澶х殑闄愬埗銆傚疄闄呬笂TMP涓嬬殑DSL涔熷緢灝戞湁浠や漢婊℃剰鐨勩? 鎵浠ヨ錛孴MP鍦ㄤ嬌鐢ㄤ笂鐨勫畨鍏ㄦф潵婧愪簬鎿嶄綔絎﹀鐢紙鎴栭噸杞斤級鐨勭壒鎬с備絾鏄紝鎿嶄綔絎︽湰韜殑璇硶鐗規ф槸鍥哄畾鐨勶紝榪欎嬌寰椾緷璧栦簬鎿嶄綔絎︼紙娉涘寲鎴栭潪娉涘寲錛夐噸杞界殑TMP涓嶅彲鑳芥垚涓虹湡姝f剰涔変笂鐨凪P鎵嬫銆? 閭d箞錛屽浜嶵MP鑰岃█錛屾垜浠劅鍏磋叮鐨勬槸瀹冪殑瀹夊叏鎬у拰鐩稿鎬с傝屽鍏朵笉婊$殑錛屽垯鏄娉曟瀯閫犵殑鐏墊椿鎬с傛湰鐫“鍘誨叾緋熺矔錛屽彇鍏剁簿鍗?#8221;鐨勫畻鏃紝鎴戜滑鍙互瀵筎MP鍋氫竴鐣敼榪涳紝浠ヨ幏寰楁洿瀹屾暣鐨凪P鎶鏈俆MP鐨勬牳蹇冭嚜鐒舵槸妯℃澘錛堢被妯℃澘鍜屽嚱鏁?鎿嶄綔絎︽ā鏉匡級錛屽湪concept鐨勫府鍔╀笅錛屾ā鏉垮彲浠ヨ幏寰楁渶濂界殑瀹夊叏鎬у拰鐩稿鎬с備互姝や負鍩虹錛屽鏋滄垜浠皢妯℃澘鎵╁睍鍒拌娉曟瀯閫犱笂錛岄偅涔堜究鍙互鍦ㄤ繚鐣橳MP鐨勫畨鍏ㄦу拰鐩稿鎬х殑鎯呭喌涓嬶紝鑾峰緱鏇村ぇ鐨勮娉曠伒媧繪с備篃灝辨槸璇達紝鎴戜滑闇瑕佸鍔犱竴縐嶆ā鏉庫斺?strong>璇硶妯℃澘 template<typename T> 榪欓噷鎴戞潨鎾頒簡鍏抽敭瀛梥yntax錛屽茍涓斿厑璁鎬負璇硶鏋勯犲懡鍚嶏紝渚夸簬浣跨敤銆傝岃娉曟瀯閫犳弿榪幫紝鍒欐槸絳夊彿鍚庨潰鐨勯儴鍒嗐俽equire娌跨敤鑷狢++0x鐨刢oncept鎻愭銆傜◢浣滀簡浜涙敼閫狅紝鍏佽concept涔嬮棿鐨剕|銆? 濡傛灉姣旇緝甯︾害鏉熺殑ast瀹忓拰璇硶妯℃澘錛屼細鍙戠幇鏋佸叾鐩鎬技銆傚疄闄呬笂錛屼袱鑰呮畩閫斿悓褰掞紝灞曠ず浜嗗嚑涔庡畬鍏ㄧ浉鍚岀殑涓滆タ銆俛st瀹忓拰TMP鍒嗗埆浣嶄簬鍚屼竴涓棶棰樼殑涓ょ錛屽綋瀹冧滑鐨勭己闄峰緱鍒板譏琛ユ椂錛屼究浼氱浉浜掗潬鎷紝鏈緇堝綊緇撳埌涓縐嶅艦寮忎笂銆?nbsp; 鐜板湪錛岄氳繃緇撳悎涓ょ鏂規鐨勭壒鑹詫紝鎴戜滑渚垮彲浠ュ緱鍒頒竴涓渶緇堢殑MP鏋勯狅紝鏃㈠畨鍏紝鍙堢伒媧伙細 syntax synSwap=x "<->" y ";"; where (x,y is object) && SameType<x, y> && (has_swap_mem<x> || (CopyConstructable<x> and Assignable<x>)) { std::swap(x, y); } 鎴戝幓鎺変簡template鍏抽敭瀛楋紝鍦ㄧ害鏉?where)鐨勪綔鐢ㄤ笅錛宼emplate鍜岀被鍨嬪弬鏁板垪琛ㄩ兘宸茬粡娌℃湁蹇呰浜嗐傚悓鏃訛紝涔熷厑璁哥洿鎺ュ皢瀵硅薄鏀懼叆 concept錛欰ssignable<x>錛岃繖鐩稿綋浜庯細Assignable<decltype<x>>銆? “is ...”鏄壒鍒殑綰︽潫錛岀敤鏉ユ弿榪伴偅浜涜秴瓚奵oncept鑼冪暣鐨勭壒鎬с?#8220;...”鍙互鏄叧閿瓧“object”錛岃〃鏄庣浉搴旂殑鏍囪瘑絎︽槸瀵硅薄錛涗篃鍙互鏄叧閿瓧 “type”錛岃〃鏄庣浉搴旂殑鏍囪瘑絎︽槸綾誨瀷錛涙垨鑰呮槸鍏抽敭瀛?#8220;concept”錛屾寚瀹氱浉搴旂殑鏍囪瘑絎︽槸concept絳夌瓑銆傛搷浣滅鐨勯噸杞芥墍娑夊強鐨勫弬鏁板彧浼氭槸瀵硅薄錛屽彧闇瀵瑰叾綾誨瀷鍋氬嚭綰︽潫錛屽洜姝oncept渚胯凍澶熶嬌鐢ㄣ備絾璇硶鏋勯犵殑瀹氫箟鍒欏箍澶х殑澶氾紝瀹冧笉浠呬粎浼氭秹鍙婂璞★紝鏇村彲鑳芥秹鍙婂叾瀹冪被鍨嬬殑璇硶瑕佺礌銆傚疄闄呬笂錛岃娉曟瀯閫犳墍闈㈠鐨勫弬鏁版槸“鏍囪瘑絎?#8221;銆傞偅涔堜竴涓爣璇嗙涓婂彲鑳藉叿澶囩殑鍚勭鐗規э紝閮藉簲褰撲綔涓虹害鏉熺殑鍐呭銆傝繖閲屽ぇ鑷村綊綰沖嚭浠ヤ笅鍑犵偣闇瑕佺害鏉熺殑鐗規э細 涔熷彲浠ヨ涓猴紝璇硶鏋勯犵殑綰︽潫鏄痗oncept鐨勮嚜鐒跺歡浼搞俢oncept瀵圭被鍨嬪仛鍑虹害鏉燂紝鑰岃娉曟瀯閫犵殑綰︽潫鐨勫璞★紝鍒欐槸鏍囪瘑絎︺? 涓轟簡寮哄寲璇硶鏋勯犵殑鍒涘緩鑳藉姏錛屽簲褰撳厑璁稿湪璇硶鏋勯犵殑瀹氫箟涓嬌鐢˙NF錛屾垨鍏朵粬綾諱技鐨勮娉曟弿榪拌璦銆? 鍦ㄨ娉曟瀯閫犵害鏉熺殑鏀彺涓嬶紝渚垮彲浠ュ寲瑙d竴浜涘瓙璇█鍚屽涓昏璦涔嬮棿鐨勮娉曞啿紿併傛瘮濡傦紝鎴戜滑鍒涘緩浜嗕竴縐嶇被浼約pirit鐨凟BNF瀛愯璦錛屽彲浠ユ寜鐓ф爣鍑嗙殑EBNF褰㈠紡緙栧啓璇硶錛屾瀯閫犱竴涓娉曡В鏋愬櫒錛? syntax repeat1=p '+' where p is object of type(Parser) {...} 榪欐牱渚垮畾涔変簡涓涓悗緙褰㈠紡鐨?鎿嶄綔絎︼紝浣嗕粎浠呬綔鐢ㄤ簬綾誨瀷Parser鐨勫璞′笂銆傚浜庡涓嬬殑浠g爜錛? letter + number 浣跨敤涓昏璦鐨?錛堝姞錛夛紝榪樻槸浣跨敤EBNF鐨?錛堥噸澶嶏紝鑷沖皯涓嬈★級錛屽彇鍐充簬letter鍜宯umber鐨勭壒寰侊紙榪欓噷鏄被鍨嬶級錛? int letter, number; letter + number; //浣跨敤涓昏璦鐨?錛岃〃紺簂etter鍔爊umber Parser letter, number; letter + number; //浣跨敤EBNF鐨?錛岃〃紺轟竴涓瞝etter鍚庨潰璺熶竴涓猲umber 濡傛錛屼究浣垮緱鐢ㄦ埛瀹氫箟鐨勮娉曚笉浼氬悓涓昏璦鐨勭浉鍚岃娉曞彂鐢熷啿紿併? 浣嗘槸錛岃娉曟瀯閫犵殑綰︽潫騫朵笉鑳藉畬鍏ㄦ秷闄ゆ墍鏈夌殑璇硶鍐茬獊銆傚叾涓竴縐嶆儏鍐典究鏄父閲忕殑浣跨敤銆傛瘮濡傦細 'x' + 'y' 瀹冨湪瀹夸富璇█涓紝浼氳璇嗗埆涓轟袱涓瓧絎︾殑鐩稿姞銆備絾鍦˙NF瀛愯璦涓紝鍒欎細鏄嫢騫蹭釜瀛楃'x'涔嬪悗绱ц窡涓涓?#8216;y'銆傜敱浜庢病鏈夌被鍨嬨佸璞$瓑浠g爜瀹炰綋鐨勫弬涓庯紝緙栬瘧鍣ㄦ棤娉曞垎杈ㄤ嬌鐢ㄥ摢縐嶈璦鐨勮娉曡鍒欐潵澶勭悊銆傝В鍐崇殑鏂規硶鏄嬌寰楀父閲忕被鍨嬪寲銆傝繖縐嶅仛娉曞湪C++絳夎璦涓凡緇忚繍鐢ㄥ騫淬傞氬父閲囩敤涓哄父閲忓姞鍓嶅悗緙錛? 'x'b_ + 'y'b_ 浠ユ浠h〃BNF瀛愯璦鐨勫父閲忋傚父閲忕殑璇硶瀹氫箟鍙互鏄細 syntax bnf_const="'" letter "'" "b_"; where is const of ... //...鍙互鏄煇縐嶇被鍨? {...} 閫氳繃is const of綰︽潫錛屽皢鎵瀹氫箟鐨勫父閲忎笌鏌愪釜綾誨瀷緇戝畾銆傝岄氳繃綾誨瀷錛岀紪璇戝櫒渚垮彲浠ユ帹鏂嚭搴斿綋浣跨敤閭g璇硶瀵瑰叾澶勭悊銆? 鐒惰岋紝灝界甯︾害鏉熺殑璇硶鏋勯犲畾涔夊彲浠ュ湪寰堝ぇ紼嬪害涓婃秷闄よ娉曞啿紿佸拰姝т箟錛屼絾涓嶅彲鑳芥秷闄ゆ墍鏈夌殑璇硶鐭涚浘銆傚彟涓鏂歸潰錛岀粨鏋勭浉浼鹼紝浣嗚涔夊畬鍏ㄤ笉鍚岀殑璇硶鏋勯犳販鍚堝湪涓璧鳳紝鍗充究涓嶅紩鍙戠煕鐩撅紝涔熶細瀵逛嬌鐢ㄨ呴犳垚闅句互棰勮鐨勬販涔便傚洜姝わ紝鍦ㄥ疄闄呯幆澧冧笅錛岄渶瑕侀氳繃鏌愮“璇硶鍥存爮”涓ユ牸闄愬畾鏌愮鐢ㄦ埛瀹氫箟璇硶鐨勪綔鐢ㄨ寖鍥淬傛渶鐩存帴鐨勫艦寮忥紝灝辨槸閫氳繃namespace瀹炵幇銆俷amespace鍦ㄩ殧紱誨拰鍗忚皟鍛藉悕鍐茬獊涓搗鍒板緢濂界殑浣滅敤錛屽彲浠ヨ繘涓姝ュ皢鍏惰繍鐢ㄥ埌MP涓傜敱浜巒amespace涓緇忔墦寮錛屽叾浣滅敤鑼冨洿涓嶄細瓚呭嚭鏈鍐呭眰鐨勪唬鐮佸潡浣滅敤鍩燂細 { using namespace XXX; ... } //XXX鐨勪綔鐢ㄨ寖鍥翠笉浼氳秴鍑鴻繖涓寖鍥? 榪愮敤榪欎釜鐗規э紝鍙互寰堣嚜鐒跺湴灝嗚暣钘忓湪涓涓猲amespace涓殑鐢ㄦ埛瀹氫箟璇硶鏋勯犻檺鍒跺湪涓涓‘瀹氱殑鑼冨洿鍐呫? 浣嗘槸錛屼粎姝や笉澶熴傛瘯绔熻娉曚笉鍚屼簬鍛藉悕錛屼笉浠呬細瀛樺湪鍐茬獊錛岃繕浼氬瓨鍦紙鍚堟硶鐨勶級娣鋒穯錛岃屼笖寰寰鏄潪甯稿嵄闄╃殑銆備負姝わ紝闇瑕佸厑璁稿湪using namespace鐨勬椂鍊欒繘涓姝ユ寚瀹氳娉曠殑鎺掍粬鎬с傛瘮濡傦細 { using namespace XXX exclusive; ... } 濡傛灉namespace涓殑鐢ㄦ埛瀹氫箟璇硶涓庡閮ㄨ娉曪紙瀹夸富璇█錛屾垨澶栧洿寮曠敤鐨刵amespace錛夐噸鍙狅紙鍐茬獊鎴栨販娣嗭級錛屽閮ㄨ娉曞皢琚睆钄姐傛洿榪涗竴姝ワ紝鍙互鍏佽涓嶅悓綰у埆鐨勬帓浠栵細鎺掓枼閲嶅彔鍜屽畬鍏ㄥ睆钄姐傚墠鑰呭彧灞忚斀閲嶅彔鐨勮娉曪紝榪欑綰у埆閫氬父鐢ㄤ簬鎵╁睍鎬х殑鐢ㄦ埛璇硶鏋勯狅紙鎵╁睍涓昏璦錛岄渶瑕佸悓涓昏璦鍗忓悓宸ヤ綔銆傝屼笖璇硶閲嶅彔杈冨皯錛夛紱鑰屽悗鑰呭垯灝嗗閮ㄨ娉曠粺緇熷睆钄斤紝鍙繚鐣欐墍鎵撳紑鐨刵amespace涓殑璇硶錛堝瓙璇█鍦ㄤ唬鐮佸潡涓槸鍞竴璇█錛夛紝榪欑綰у埆鐢ㄤ簬鐩稿鐙珛鐨勫姛鑳芥у瓙璇█錛堝彲浠ョ嫭绔嬪伐浣滅殑瀛愯璦錛岄氬父浼氫笌涓昏璦鍜屽叾浠栧瓙璇█闂村瓨鍦ㄨ緝澶х殑璇硶閲嶅彔錛屾瘮濡備笂榪癇NF瀛愯璦絳夌瓑錛夈? 涓烘彁渚涙洿澶氱殑鐏墊椿鎬э紝鍙互鍦ㄥ畬鍏ㄥ睆钄界殑鎯呭喌涓嬶紝閫氳繃鐗瑰畾璇彞寮曞叆鏌愮涓嶄細寮曞彂鍐茬獊鐨勫閮ㄨ娉曘傛瘮濡傦細 { using namespace XXX exclusive full; using host_lang::syntax(...); //寮曞叆涓昏璦鐨勬煇涓娉曪紝...浠h〃璇硶鍚嶇О ... } 閫氬父鎯呭喌涓嬶紝瀛愯璦涓嶄細瀹屽叏鐙珛榪愪綔錛岄渶瑕佸悓瀹夸富璇█鎴栧叾浠栧瓙璇█浜や簰錛屼篃灝辨槸鏁版嵁浜ゆ崲銆備富璇█浠g爜鍙兘闇瑕佸皢鏁版嵁瀵硅薄浼犻掔粰瀛愯璦錛屽鐞嗗畬鎴愬悗鍐嶅彇鍥炪傜敱浜庣紪璇戝櫒渚濊禆浜庢爣璇嗙鐨勭壒鎬э紙涓昏鏄被鍨嬶級鏉ラ夋嫨璇硶鏋勯犮傛墍浠ワ紝涓縐嶅瓙璇█蹇呴』浣跨敤鍏跺唴閮ㄥ畾涔夌殑綾誨瀷鍜屽璞°備負浜嗚兘澶熶氦鎹㈡暟鎹紝蹇呴』鑳藉鎶婁富璇█鐨勫璞″寘瑁呮垚瀛愯璦鐨勫唴閮ㄧ被鍨嬨傞氳繃鍦ㄥ瓙璇█鐨刵amespace涓繘琛宼rue typedef錛屽彲浠ュ皢涓昏璦綾誨瀷瀹氫箟鎴愪竴涓柊鐨勶紙鐪燂級綾誨瀷錛屽湪榪涘叆瀛愯璦浣滅敤鍩熺殑鏃跺欙紝鍋氭樉寮忕殑綾誨瀷杞崲銆傚彟澶栵紝涓轟簡鏂逛究鏁版嵁杞崲錛岃繕鍙互閲囩敤涓ょ鏂規硶錛氬皢涓昏璦綾誨瀷map鍒頒竴涓瓙璇█綾誨瀷錛堢浉褰撲簬緇欎簣“鍙岄噸鍥界睄”錛夛紝榪涘叆瀛愯璦鐨勮娉曡寖鍥存椂錛岀浉搴旂殑瀵硅薄鍦ㄧ被鍨嬩笂鍏鋒湁涓ら噸鎬э紝鍙互琚嚜鍔ㄨ瘑鍒垚鎵闇鐨勭被鍨嬶紝浣嗗繀欏誨湪紜繚涓嶅彂鐢熻娉曟販娣嗙殑鎯呭喌涓嬩嬌鐢紱鍙︿竴縐嶇ǔ濡ヤ簺鐨勬柟娉曪紝鍙互鍏佽鎵ц涓縐峵ypedef錛屼粙浜巃lias鍜宼rue typedef涔嬮棿錛屽畠瀹氫箟浜嗕竴涓柊綾誨瀷錛屼絾鍙互闅愬紡鍦板悓鍘熸潵鐨勭被鍨嬬浉浜掕漿鎹€傛暟鎹氦鎹㈢殑闂杈冨鏉傦紝寰堝闂灝氭湭鐞嗘竻錛屾湁寰呰繘涓姝ヨ冨療銆? 浣滀負MP鎵嬫錛宎st瀹忔嫢鏈夌伒媧繪э紝鑰孴MP鍒欏叿澶囧畨鍏ㄦэ紝灝嗕袱鑰呭悇鑷殑浼樼偣鐩哥粨鍚堬紝浣挎垜浠彲浠ヨ幏寰楁洿鍔犵伒媧誨拰瀹夊叏鐨勮娉曟瀯閫犲畾涔夋墜孌點傞氳繃鍦ㄧ敤鎴峰畾涔夌殑璇硶鏋勯犱笂鏂藉姞鍏ㄩ潰鐨勭害鏉燂紝鍙互寰堝ソ鍦拌閬胯娉曞啿紿佸拰姝т箟銆? 浣嗘槸錛岄渶瑕佽鏄庣殑鏄紝榪欓噷鎵鑰冨療鐨勪粎浠呭眬闄愬湪鐢ㄦ埛瀹氫箟璇硶鏋勯犵殑鍐茬獊鍜屾涔夌殑娑堥櫎涓娿侴PL/MP瑕佺湡姝h揪鍒板疄鐢ㄩ樁孌碉紝榪橀渶瑕侀潰瀵規洿澶氶棶棰樸傛瘮濡傦紝鐢變簬瀛樺湪鐢ㄦ埛瀹氫箟鐨勮娉曟瀯閫狅紝璇硶鍒嗘瀽闃舵鎵闈㈠鐨勮娉曚笉鏄浐鎬佺殑錛岄渶瑕侀殢鏃墮殢鍦版帴鍙楁柊璇硶錛岀敋鑷抽噸鍙犵殑璇硶錛堝瓨鍦ㄥ涓欓夎娉曪紝涓嶅悓鐨勫欓夎娉曞張浼氫駭鐢熶笉鍚岀殑涓嬬駭璇硶錛夛紝榪欏氨浣胯娉曞垎鏋愬ぇ澶у鏉傦紱璇硶妯″紡鍖歸厤琚帹榪熷埌璇箟鍒嗘瀽闃舵錛屾鍓嶅皢鏃犳硶瀵規煇浜涜娉曢敊璇綔鍑烘楠岋紱涓涓娉曟瀯閫犵殑璇箟闇瑕侀氳繃瀹夸富璇█瀹氫箟錛屽浣曡鎺ュ畾涔変唬鐮佸拰鍛ㄨ竟鐨勭幆澧冨拰鐘舵侊紱濡備綍涓虹敤鎴峰畾涔夌殑璇硶鏋勯犺緗嚭閿欎俊鎭紱鐢變簬鏌愪簺璇硶鏋勯犵殑浜屼箟鎬э紝濡備綍鍒ゅ埆璇硶閿欒灞炰簬鍝釜璇硶鏋勯狅紱...銆傛澶栬繕鏈変竴浜涙洿鏈川鎬х殑闂錛岃濡傝娉曟瀯閫犵殑閲嶈澆鍜屼簩涔夋ф槸鍚︿細鏇村鏄撹浣夸嬌鐢ㄨ呬駭鐢熸洿澶氱殑閿欒絳夌瓑錛岀壍娑夊埌閿欑患澶嶆潅鐨勯棶棰橈紝闇瑕佹洿澶氱殑鍒嗘瀽鍜岃瘯楠屻? 鍙﹀錛屼綔涓篗P鐨勯噸瑕佺粍鎴愰儴鍒嗭紝緙栬瘧鏈熻綆楄兘鍔涗篃鑷沖叧閲嶈銆俆MP榪愮敤浜咰++妯℃澘鐗瑰寲錛孌璇█閫氳繃鏇存槗浜庣悊瑙g殑static_if絳夋満鍒訛紝閮借瘯鍥捐幏寰楃紪璇戞湡鐨勮綆楄兘鍔涳紝榪欎簺鏈哄埗鍦ㄥ畬鏁寸殑MP涓渶瑕佽繘涓姝ユ墿灞曪紝鑰屽茍闈炰粎浠呭眬闄愬湪涓庣被鍨嬬浉鍏崇殑璁$畻涓娿傚叾浠栦竴浜涗笌姝ょ浉鍏崇殑鐗規э紝鍖呮嫭鍙嶅皠錛堢紪璇戞湡鍜岃繍琛屾湡錛夈佺被鍨媡raits絳夛紝涔熷簲浣滀負MP蹇呬笉鍙皯鐨勭壒鎬с? 鐒惰岋紝涓嶄箙鍓嶏紝鍦═opLanguage group涓婄殑涓嬈¤璁猴紝淇冧嬌鎴戜滑娉ㄦ剰鍒皉untime GP榪欎釜姒傚康銆備粠涓紝鎴戜滑鐪嬪埌浜嗗笇鏈涒斺斾嬌GP runtime鍖栫殑甯屾湜鈥斺斾嬌寰桮P鏈夋湜鍦ㄨ繍琛屾椂鍙戞尌鍏跺法澶х殑濞佸姏錛岃繘涓姝ヤ負杞歡鐨勮璁′笌寮鍙戝甫鏉ユ洿楂樼殑鏁堢巼鍜屾洿鐏墊椿鐨勭粨鏋勩?br> 鍦ㄨ繖涓柊鐨勭郴鍒楁枃绔犱腑錛屾垜璇曞浘榪愮敤runtime GP瀹炵幇涓浜涚畝鍗曪紝浣嗗吀鍨嬬殑妗堜緥錛屾潵媯嫻媟untime GP鐨勮兘鍔涘拰闄愬埗錛屽悓鏃朵篃鍙互榪涗竴姝ユ帰璁ㄥ拰灞曠ず榪欑鎶鏈殑鐗規с?
concept琛紙concept list錛変笉鍐嶅悓瀵硅薄鏀懼湪涓璧鳳紝鑰屾槸鍚屼竴涓被鍨嬬殑綾誨瀷淇℃伅鏀懼湪涓璧楓備竴鍚屾斁緗殑榪樻湁ctable銆俢table涓瘡涓搴旂殑concept欏歸兘鏈変竴涓寚鍚?concept琛ㄧ殑鎸囬拡錛堜篃鍙互鎸囧悜綾誨瀷淇℃伅澶達級錛岀敤浠ユ壘鍒癱oncept list錛屾墽琛宑oncept cast銆傚姩鎬佸璞★紝鎴栧姩鎬佸璞$殑寮曠敤/鎸囬拡涓婂彧闇闄勫姞涓涓寚鍚戠浉搴旂殑concept鐨勬寚閽堝嵆鍙傜浉姣斿墠涓涓柟妗堬紝鍐呭瓨鍒╃敤鐜囨洿楂樸?/p> by 鑾崕鏋? 鍏厓鍓?16騫?鏈?鏃ワ紝鎰忓ぇ鍒╀笢閮ㄥ鉤鍘燂紝涓涓彨鍋氬潕灝肩殑鍦版柟錛屼袱鏀ぇ鍐涙憜寮闃靛娍錛屽噯澶囧喅涓姝繪垬銆備竴鏂規槸鐢變繚緗楁柉鍜岀摝緗椾袱浣嶆墽鏀垮畼鐜囬鐨勭綏椹漢錛屽彟涓鏂瑰垯鏄紵澶х殑鍐涗簨澶╂墠姹夊凹鎷?宸村崱鐜囬鐨勮喀澶熀鍐涢槦鍙婂叾鍚岀洘銆傜綏椹漢瓚呰繃8涓囷紝鑰岃喀澶熀浠呮湁4涓囦綑浜恒傜劧鑰屽埌浜嗗倣鏅氾紝緗楅┈浜鴻褰誨簳鍑昏觸錛?涓囦漢琚潃錛屼粎鏈夊皯鏁板緱浠ラ冭劚銆傝繖灝辨槸钁楀悕鐨勫潕灝間細鎴樸傜粡姝や竴褰癸紝錛堝鍔犲厛鍓嶈繘琛岀殑鐗瑰埄姣斾簹鍜岀壒鎷夎タ姊呰婀栦細鎴橈級錛岀綏椹漢鍏冩皵澶т激錛屾垚騫村叕姘戞崯澶辮揪浜斿垎涔嬩竴銆傞儴鍒嗗煄閭﹁儗鍙涚綏椹紝瑗胯タ閲屼篃鍙戠敓璧蜂箟銆傜綏椹凡緇忓埌浜嗘憞鎽囨鍧犵殑鍦版銆?/em> 姹夊凹鎷旂殑榪欎簺鑳滃埄錛屽畬鍏ㄥ緱鐩婁簬鍏堝墠鐨勪竴嬈″紓涔庡甯哥殑榪滃緛銆傚叕鍏冨墠218騫達紝姹夊凹鎷旂巼棰嗗啗闃燂紝浠庢柊榪﹀お鍩哄煄錛堣タ鐝墮錛夊嚭鍙戯紝緲昏秺姣斿埄鐗涙柉灞憋紝榪涘叆鍗楅珮鍗㈠湴鍩熴傚湪浠栭潰鍓嶆湁涓ゆ潯璺彲璧幫紝緲昏秺闃垮皵淇炬柉灞憋紝鎴栬呮部嫻峰哺榪涘叆鎰忓ぇ鍒┿備絾鏄紝褰撴椂緗楅┈浜哄凡鍦ㄦ部嫻峰湴鍖洪儴緗蹭簡涓ゆ敮閮ㄩ槦錛屽噯澶囨嫤鎴眽灝兼嫈銆傝屼笖錛岀綏椹漢鐨勬搗鍐涗紭鍔匡紝浣垮緱浠栦滑鍙互鍦ㄤ換浣曟椂鍊欏皢涓鏀儴闃熺櫥闄嗗湪浠栫殑鑳屽悗銆傝岀炕瓚婇樋灝斾烤鏂北錛屽垯鏄竴鏉″強鍏惰壈闄╃殑閬撹礬錛屾洿浣曞喌鏄湪鍐ぉ銆?/em> 姹夊凹鎷旈夋嫨浜嗛樋灝斾烤鏂北銆備粬鐢╁紑浜嗙綏椹漢錛屼粠灝忓湥璐濈撼寰峰拰鏃ュ唴鐡﹀北涔嬮棿瓚婅繃闃垮皵淇炬柉灞憋紝榪涘叆鎰忓ぇ鍒╁鍐呫傛鏃訛紝緗楅┈浜轟究澶卞幓浜嗘垬鐣ョ旱娣憋紝涓鎶婂皷鍒宸茬粡娣辨繁鍦版彃鍏ヤ粬浠殑鑵瑰唴... C++鐨勫彂灞曞彶涓婏紝涔熸湁鐫濡傚悓姹夊凹鎷旂炕瓚婇樋灝斾烤鏂北榪滃緛銆備竴鍒囪繕寰椾粠C with Class鏃朵唬璇磋搗銆? Bjarne鏇劇粡鍙嶅寮鴻皟錛屼粬鍒涘緩C++涓虹殑鏄皢Simular鐨勬娊璞¤兘鍔涘悓C鐨勬ц兘緇撳悎璧鋒潵銆備簬鏄紝鍦–璇█鐨勫熀紜涓婏紝璇炵敓浜嗕竴縐嶆嫢鏈夌被銆佺戶鎵褲侀噸杞界瓑絳夐潰鍚戝璞℃満鍒剁殑璇█銆傚湪榪欎釜闃舵錛孋++鎻愪緵浜嗕袱涓柟闈㈢殑鎶借薄鑳藉姏銆備竴縐嶆槸鏁版嵁鎶借薄錛屼篃灝辨槸灝嗘暟鎹墍瑕佽〃杈劇殑鍚箟閫氳繃綾誨瀷浠ュ強渚濋檮浜庣被鍨嬩笂鐨勬垚鍛樿〃榪般傚彟涓縐嶅垯鏄鎬侊紝涓縐嶆渶鍘熷鐨勫鎬侊紙閲嶈澆錛夈? 鏁版嵁鎶借薄錛岄氳繃琚О涓?#8220;鎶借薄鏁版嵁綾誨瀷錛圓DT錛?#8221;鐨勬妧鏈疄鐜般侫DT鐨勪竴縐嶆柟妗堬紝灝辨槸綾匯傜被鎵鎻愪緵鐨勫皝瑁呮у皢涓涓暟鎹疄浣撶殑澶栧湪鐗瑰緛錛屾垨鑰呰璇箟鐨勮〃榪板艦寮忥紝鍚屽叿浣撶殑瀹炵幇錛屾瘮濡傛暟鎹瓨鍌ㄥ艦寮忥紝鍒嗙銆傝繖鏍鋒墍澧炲姞鐨勪腑闂村眰灝嗘暟鎹殑浣跨敤鑰呭悓鏁版嵁鐨勫疄鐜拌呴殧紱伙紝浣垮緱浠栦滑浣跨敤鍏卞悓鐨勭害瀹氳涔夊伐浣滐紝涓嶅啀鐩鎬簰浜嗚В褰兼鐨勭粏鑺傦紝浠庤屼嬌寰椾袱鑰呭緱浠ヨВ鑰︺? 澶氭佸垯鏄洿鍔犲熀紜鏇村姞閲嶈鐨勪竴縐嶇壒鎬с傚鎬佷嬌寰楁垜浠緱浠ョ敤鍚屼竴縐嶇鍙峰疄鐜版煇縐嶇‘瀹氱殑璇箟銆傚鎬佺殑綺鵑珦鍦ㄤ簬錛氫互涓縐嶅艦寮忚〃杈句竴縐嶈涔夈傚湪姝や箣鍓嶏紝鎴戜滑寰寰琚揩浣跨敤涓嶅悓鐨勭鍙鋒潵浠h〃鍚屼竴縐嶆娊璞¤涔夛紝涓虹殑鏄傚簲寮虹被鍨嬬郴緇熸墍鏂藉姞鐨勭害鏉熴傛瘮濡傦細 //浠g爜#1 寰堟樉鐒訛紝榪欎袱涓嚱鏁拌〃杈劇殑璇箟鍒嗗埆鏄?#8220;鎶婁袱涓猧nt綾誨瀷鍊煎姞鍦ㄤ竴璧?#8221;鍜?#8220;鎶婁袱涓猣loat綾誨瀷鍊煎姞鍦ㄤ竴璧?#8221;銆傝繖涓や釜璇箟鎶借薄璧鋒潵閮借〃杈句簡涓涓剰鎬濓細鍔犮? 鎴戜滑鍦ㄥ仛綆楁湳棰樼殑鏃跺欐槸涓嶄細綆¤璁$畻鐨勬暟瀛楁槸鏁存暟榪樻槸瀹炴暟銆傚悓鏍鳳紝濡傛灉鑳藉鍦ㄧ紪紼嬬殑鏃跺欙紝涓嶈冭檻綆楁湳鎿嶄綔瀵硅薄鐨勭被鍨嬶紝鍙渶鍏沖績璋佸拰璋佽繘琛屼粈涔堟搷浣滐紝閭d箞浼氭柟渚垮緱澶氥傚綋C++寮曞叆閲嶈澆鍚庯紝榪欑鎰挎湜渚垮緱浠ュ疄鐜幫細 //浠g爜#2 閲嶈澆浣垮緱鎴戜滑鍙渶鍏沖績“鍔?#8221;榪欎釜璇箟錛岃嚦浜庝粈涔堢被鍨嬪拰浠涔堢被鍨嬬浉鍔狅紝鍒欑敱緙栬瘧鍣ㄦ牴鎹搷浣滄暟鐨勭被鍨嬭嚜鍔ㄨВ鏋愩? 浠庢煇縐嶆剰涔変笂璇達紝閲嶈澆鏄闀挎湡蹇借錛屼絾鍗存瀬涓洪噸瑕佺殑涓涓璦鐗規с傚湪澶氭暟浠嬬粛OOP鐨勪功綾嶄腑錛岄噸杞藉線寰琚綔涓篛OP鐨勯檮灞炲搧錛屾斁鍦ㄤ竴浜涗笉璧風溂鐨勫湴鏂廣傚畠鐨勫鎬佹湰璐ㄤ篃琚姩澶氭佺殑浜洪犲厜鐜墍璁鵑伄钄姐傜劧鑰岋紝閲嶈澆鐨勯噸瑕佷綔鐢ㄥ嵈鍦ㄥ疄璺典腑娼滅Щ榛樺寲鍦頒綋鐜板嚭鏉ャ傞噸杞藉樊涓嶅鍙互鐪嬩綔璇█榪堝叆鐜頒唬鎶借薄浣撶郴鐨勭涓姝ャ傚畠鐨勫疄闄呮晥鐢ㄧ敋鑷寵瓚呰繃琚箍涓哄叧娉ㄧ殑OOP錛岃屼笉浼氬儚OOP閭f牱鍦ㄨ幏寰楁娊璞$殑鍚屾椂錛屼即闅忕潃涓嶅皬鐨勫壇浣滅敤銆? 闅忕潃铏氬嚱鏁扮殑寮曞叆錛孋++寮濮嬪叿澶囦簡棰囧叿浜夎鐨勫姩澶氭佹妧鏈傝櫄鍑芥暟鏄竴縐嶄緷闄勪簬綾伙紙OOP鐨勭被鍨嬪熀紜錛夌殑澶氭佹妧鏈傚叾鎶鏈熀紜鏄悗鏈熺粦瀹氾紙late-binding錛夈傚綋涓涓被D緇ф壙鑷被B鏃訛紝瀹冩湁涓ょ鏂規硶瑕嗙洊錛坥verride錛塀涓婄殑鏌愪釜鍑芥暟錛? //浠g爜#3 class D:public B 褰撶戶鎵跨被D涓0鏄庝簡鍚屽熀綾籅涓垚鍛樺嚱鏁扮浉鍚屽嚱鏁板悕銆佺浉鍚岀鍚嶇殑鎴愬憳鍑芥暟錛岄偅涔堝熀綾葷殑鎴愬憳鍑芥暟灝嗚瑕嗙洊銆傚浜庡熀綾葷殑闈炶櫄鎴愬憳鍑芥暟錛岀戶鎵跨被浼氱洿鎺ュ皢鍏墮伄钄姐傚浜庣被鍨婦鐨勪嬌鐢ㄨ咃紝fun1浠h〃浜咲涓墍璧嬩簣鐨勮涔夈傝岀被鍨婦鐨勫疄渚嬶紝鍙互闅愬紡鍦拌漿鎹㈡垚綾誨瀷B鐨勫紩鐢╞錛屾鏃惰皟鐢╞鐨刦un1錛屽垯鎵ц鐨勬槸綾籅鐨刦un1 瀹氫箟錛岃岄潪綾籇鐨刦un1錛屽敖綆℃鏃禸瀹為檯鎸囧悜涓涓狣鐨勫疄渚嬨? 浣嗘槸錛屽鏋滅戶鎵跨被瑕嗙洊浜嗗熀綾葷殑铏氬嚱鏁幫紝閭d箞灝嗗緱鍒扮浉鍙嶇殑緇撴灉錛氬綋璋冪敤寮曠敤b鐨刦un2錛屽疄闄呬笂鍗存槸璋冪敤浜咲鐨刦un2瀹氫箟銆傝繖琛ㄦ槑錛岃鐩栦竴涓櫄鍑芥暟錛屽皢浼氬湪緇ф壙綾誨拰鍩虹被涔嬮棿鐨勬墍鏈夊眰嬈′笂鎵ц瑕嗙洊銆傝繖縐嶅交搴曠殑銆佸叏鏂逛綅鐨勮鐩栬涓猴紝浣垮緱鎴戜滑鍙互鍦ㄧ戶鎵跨被涓婁慨楗版垨鎵╁睍鍩虹被鐨勫姛鑳芥垨琛屼負銆傝繖渚挎槸OOP鎵╁睍鏈哄埗鐨勫熀紜銆傝岃繖縐嶆妧鏈縐頒負鍔ㄥ鎬侊紝鎰忔濇槸鍩虹被寮曠敤鎵琛ㄨ揪鐨勮涔夊茍闈炲彇鍐充簬鍩虹被鏈韓錛岃屾槸鏉ユ簮浜庡畠鎵鎸囧悜鐨勫疄闄呭璞★紝鍥犳瀹冩槸“澶氭?#8221;鐨勩傚洜涓轟竴涓紩鐢ㄦ墍鎸囧悜鐨勫璞″彲浠ュ湪榪愯鏃跺彉鎹紝鎵浠ュ畠鏄?#8220;鍔?#8221;鐨勩? 闅忕潃鍔ㄥ鎬佽屾潵鐨勪竴涓?#8220;鍓駭鍝?#8221;錛屽嵈浜嬪疄涓婃垚涓轟簡OOP鐨勬牳蹇冨拰鏀煴銆傝櫄鍑芥暟鐨?#8220;鍔ㄥ鎬?#8221;鐗規у皢鎴戜滑寮曞悜涓涓瀬绔殑鎯呭喌錛氫竴涓兘鏄櫄鍑芥暟鐨勭被銆傛洿閲嶈鐨勶紝榪欎釜綾諱笂鐨勮櫄鍑芥暟閮芥病鏈夊疄鐜幫紝姣忎釜铏氬嚱鏁伴兘鏈浘鎸囧悜涓涓疄瀹炲湪鍦ㄧ殑鍑芥暟浣撱傚綋鐒訛紝榪欐牱鐨勭被鏄棤娉曠洿鎺ヤ嬌鐢ㄧ殑銆傛湁瓚g殑鏄紝榪欑琚О涓?#8220;鎶借薄鍩虹被”鐨勭被錛?strong>榪嬌鎴戜滑緇ф壙瀹冿紝騫?#8220;鏇垮畠”瀹炵幇閭d簺娌℃湁瀹炵幇鐨勮櫄鍑芥暟銆傝繖鏍鳳紝瀵逛簬涓涓娊璞″熀綾葷殑寮曠敤錛屽鎬佸湴鎷ユ湁浜嗙戶鎵跨被鐨勮涓恒傝屽弽榪囨潵錛屾娊璞″熀綾誨疄闄呬笂璧峰埌浜?strong>寮鴻揩緇ф壙綾誨疄鐜版煇浜涚壒瀹氬姛鑳界殑浣滅敤銆傚洜姝わ紝鎶借薄鍩虹被鎵紨浜?strong>鎺ュ彛鐨勮鑹層傛帴鍙e叿鏈変袱閲嶄綔鐢細涓銆佺害鏉熺戶鎵跨被錛堝疄鐜拌咃級榪嬌鍏跺疄鐜伴瀹氱殑鎴愬憳鍑芥暟錛堝姛鑳藉拰琛屼負錛夛紱浜屻佹弿榪頒簡緇ф壙綾誨繀瀹氭嫢鏈夌殑鎴愬憳鍑芥暟錛堝姛鑳藉拰琛屼負錛夈傝繖涓ょ浣滅敤淇冧嬌鎺ュ彛鎴愪負浜哋OP璁捐浣撶郴鐨勬敮鏌便? C++鍦ㄨ繖鏂歸潰鐨勮繘姝ワ紝浣垮叾鎴愪負涓涓湡姝f剰涔変笂鍏峰鐜頒唬鎶借薄鑳藉姏鐨勮璦銆傜劧鑰岋紝榪欑榪涙騫墮潪“緲昏秺闃垮皵淇炬柉灞?#8221;銆傚厖鍏墮噺涔熷彧鑳界畻浣?#8220;緲昏秺姣斿埄鐗涙柉灞?#8221;銆傚浜嶤++鑰岃█錛岀湡姝h壈鑻︾殑榪滃緛鎵嶅垰寮濮嬶紝閭d護浜虹敓鐣忕殑“闃垮皵淇炬柉灞?#8221;浠嶅湪閬ヨ繙鐨勫墠鏂廣? 鍚屾眽灝兼嫈涓鏍鳳紝褰揅++涓鑴氳繄鍏?#8220;鐜頒唬鎶借薄璇█淇變箰閮?#8221;鍚庯紝渚塊潰涓翠袱縐嶉夋嫨銆傛垨鑰呭湪鍘熸湁鍩虹涓婁慨淇ˉ琛ワ紝鎴愪負涓縐峅OP璇█錛涙垨鑰呯戶緇墠榪涳紝緲昏秺閭e駭闄╁郴鐨勫北宄般侰++鐨勬眽灝兼嫈鈥斺擝jarne Stroustrup鈥斺旈夋嫨浜嗗悗鑰呫? 浠嶥&E鐨勬弿榪頒腑鎴戜滑鍙互鐪嬪埌錛屽湪C++鐨勫師濮嬭璁′腑灝卞凡緇忚冭檻“綾誨瀷鍙傛暟”鐨勯棶棰樸備絾鐩村埌90騫翠唬鍒濓紝鎵嶇湡姝f剰涔変笂鍦板疄鐜頒簡妯℃澘銆傜劧鑰岋紝妯℃澘鍙槸絎竴姝ャ傝濡侫da絳夎璦涓兘鏈夌被浼肩殑鏈哄埗錛堟硾鍨嬶紝generic錛夛紝浣嗗茍鏈褰撴椂鐨勭紪紼嬫妧鏈駭鐢熸牴鏈х殑褰卞搷銆? 鍏抽敭鎬х殑鎴愭灉鏉ユ簮浜嶢lex Stepanov鐨勮礎鐚係tepanov鍦ㄥ悗鏉ヨ縐頒負stl鐨勭畻娉?瀹瑰櫒搴撲笂鎵鍋氱殑鍔姏錛屼嬌寰椾竴縐嶆柊鍏寸殑緙栫▼鎶鏈斺旀硾鍨嬬紪紼嬶紙Generic Programming錛孏P錛夆斺旇繘鍏ヤ簡浜轟滑鐨勮閲庛俿tl鐨勪駭鐢熷C++鐨勬ā鏉挎満鍒朵駭鐢熶簡鏋佸叾閲嶈鐨勫獎鍝嶏紝淇冧嬌浜嗘ā鏉跨壒鍖栫殑璇炵敓銆傛ā鏉跨壒鍖栬〃闈笂鏄ā鏉跨殑杈呭姪鐗規э紝浣嗘槸瀹為檯涓婂畠鍗存槸姣?#8220;綾誨瀷鍙傛暟”鏇村姞鏈川鐨勬満鑳姐? 鍋囪鎴戜滑鏈変竴緇勫嚱鏁版墽琛屾瘮杈冧袱涓璞″ぇ灝忕殑鎿嶄綔錛? //浠g爜#4 閲嶈澆浣垮緱鎴戜滑鍙互浠呯敤compare涓涓嚱鏁板悕鎵ц涓嶅悓綾誨瀷鐨勬瘮杈冩搷浣溿備絾鏄繖浜涘嚱鏁板叿鏈変竴鏍風殑瀹炵幇浠g爜銆傛ā鏉跨殑寮曞叆錛屼嬌寰楁垜浠彲浠ユ秷闄よ繖縐嶉噸澶嶄唬鐮侊細 //浠g爜#5 榪欐牱涓涓ā鏉垮彲浠ュ簲鐢ㄤ簬浠諱綍綾誨瀷錛屼笉浣嗙敤涓涓鍙瘋〃杈句簡涓涓涔夛紝鑰屼笖鐢ㄤ竴涓疄鐜頒唬鏇夸簡璇稿閲嶅浠g爜銆傝繖渚挎槸GP鐨勫熀鏈綔鐢ㄣ? 鎺ヤ笅鏉ョ殑鍙樺寲錛屽彲浠ョ畻浣滅湡姝f剰涔変笂鐨?#8220;鐧誨北”浜嗐? 濡傛灉鏈変袱涓寚閽堬紝鍒嗗埆鎸囧悜涓や釜鐩稿悓綾誨瀷鐨勫璞°傛鏃跺鏋滄垜浠噰鐢ㄤ笂榪癱ompare鍑芥暟妯℃澘錛岄偅涔堝皢鏃犳硶寰楀埌鎵闇鐨勭粨鏋溿傚洜涓烘鏃舵瘮杈冪殑鏄袱涓寚閽堢殑鍊鹼紝鑰屼笉鏄墍鎸囧悜鐨勫璞℃湰韜備負浜嗗簲浠樿繖縐嶇壒孌婃儏鍐碉紝鎴戜滑闇瑕佸compare鍋?#8220;鐗瑰埆澶勭悊”錛? //浠g爜#6 榪欎釜“鐗規畩鐗堟湰”鐨刢ompare錛屽浜庝換浣曠被鍨嬬殑鎸囬拡浣滃嚭鍝嶅簲銆傚鏋滆皟鐢ㄦ椂鐨勫疄鍙傛槸涓涓寚閽堬紝閭d箞榪欎釜“鎸囬拡鐗?#8221;鐨刢ompare灝嗕細寰楀埌浼樺厛鍖歸厤銆傚鏋滄垜浠皢compare鏀規垚涓嬮潰鐨勫疄鐜幫紝閭d箞灝變細鍑虹幇闈炲父鏈夎叮鐨勮涓猴細 //浠g爜#7 褰撴垜浠皢鎸囬拡鐨勬寚閽堜綔涓哄疄鍙傦紝璋冪敤compare鏃訛紝紲炲鐨勪簨鎯呭彂鐢熶簡錛? //浠g爜#8 compare灞呯劧鎴愬姛鍦板墺紱諱簡涓や釜鎸囬拡錛屽茍涓旀紜湴姣旇緝浜嗕袱涓璞$殑鍊箋傝繖涓垙娉曞厖鍒嗗埄鐢ㄤ簡綾繪ā鏉跨殑灞閮ㄧ壒鍖栧拰鐗瑰寲瑙f瀽瑙勫垯銆傛牴鎹鍒欙紝瓚婃槸鐗瑰寲鐨勬ā鏉匡紝瓚婃槸浼樺厛鍖歸厤銆俆*鐗堢殑comp_impl姣擳鐗堢殑鏇村姞“鐗瑰寲”錛屼細寰楀埌浼樺厛鍖歸厤銆傞偅涔堝綋涓涓寚閽堢殑鎸囬拡瀹炰緥鍖朿omp_impl錛屽垯浼氬尮閰峊*鐗堢殑 comp_impl錛屽洜涓烘寚閽堢殑鎸囬拡錛屼篃鏄寚閽堛俆*鐗堥氳繃灞閮ㄧ壒鍖栨満鍒訛紝鍓ョ鎺変竴綰ф寚閽堬紝鐒跺悗鐢ㄦ墍寰楃殑綾誨瀷瀹炰緥鍖朿omp_impl銆傛寚閽堢殑鎸囬拡鍓ョ鎺変竴綰ф寚閽堬紝閭d箞榪樻槸涓涓寚閽堬紝鍙堜細鍖歸厤T*鐗堛俆*鐗堝張浼氬墺紱繪帀涓綰ф寚閽堬紝鍓╀笅鐨勫氨鏄湡姝e彲浠ユ瘮杈冪殑綾誨瀷鈥斺攄ouble銆傛鏃訛紝double宸叉棤娉曚笌 T*鐗堟湰鍖歸厤錛屽彧鑳藉尮閰嶅熀紜妯℃澘錛屾墽琛岀湡姝g殑姣旇緝鎿嶄綔銆? 榪欑濂囧鐨勬墜娉曟槸钑村惈鍦ㄦā鏉跨壒鍖栦腑涓浜涙洿鍔犳湰璐ㄧ殑鏈哄埗鐨勭粨鏋溿傝繖縐嶆剰澶栬幏寰楃殑“妯℃澘琛嶇敓浜у搧”鍙互綆椾綔涓縐嶇紪璇戞椂璁$畻鐨勮兘鍔涳紝鍚庢潵琚竴浜?#8220;濂戒簨鑰?#8221;鍙戝睍鎴愮嫭绔嬬殑“妯℃澘鍏冪紪紼?#8221;錛圱emplate Meta Programming錛孴MP錛夈? 灝界TMP鏂板鑰屽張濂ュ錛屼絾緇堢┒鍙槸涓縐嶈緟鍔╂妧鏈紝鐢ㄦ潵寮ヨˉC++鐨勪竴浜涚己闄楓佸仛涓浜涙墿灞曪紝“鎹′釜婕?#8221;浠涔堢殑銆備笉榪囧畠涓烘垜浠甫鏉ヤ簡涓ょ偣閲嶈鐨勫惎紺猴細涓銆佹垜浠湁鍙兘閫氳繃璇█鏈韓鐨勪竴浜涙満鍒訛紝榪涜鍏冪紪紼嬶紱浜屻佸厓緙栫▼鍦ㄤ竴瀹氱▼搴︿笂鍙互鍚岄氱敤璇█涓璧蜂嬌鐢ㄣ傝繖浜涘惎紺哄緙栫▼璇█鐨勫彂灞曟湁寰堝ソ鐨勬寚瀵兼剰涔夈? 妯℃澘鍙婄壒鍖栬鍒欐槸C++ GP鐨勬牳蹇冩墍鍦ㄣ傝繖浜涜璦鐗規х殑寮哄ぇ鑳藉姏騫墮潪鍑┖鑰屾潵銆傚疄闄呬笂鏈変竴鍙?#8220;騫曞悗澶ф墜”鍦ㄥ啣鍐ヤ箣涓搷綰電潃涓鍒囥? 鍋囪鏈変竴涓被鍨嬬郴緇燂紝鍖呭惈n涓被鍨嬶細t1,...,tn錛岄偅涔堣繖浜涚被鍨嬫瀯鎴愪簡涓涓泦鍚圱={t1,...,tn}銆傚湪褰撴垜浠繍鐢ㄩ噸杞芥妧鏈椂錛屽疄闄呬笂鏋勯犱簡涓緇勭被鍨嬬殑tuple鍒板嚱鏁板疄鐜扮殑鏄犲皠錛?lt;ti1,ti2,ti3,...> ->fj()銆傜紪璇戝櫒鍦ㄩ噸杞借В鏋愮殑鏃跺欙紝灝辨槸鎸夌収榪欑粍鏄犲皠瀵繪壘鍖歸厤鐨勫嚱鏁扮増鏈傚綋鎴戜滑緙栧啓浜嗗艦濡備唬鐮?5鐨勬ā鏉匡紝閭d箞灝辯浉褰撲簬鏋勫緩浜嗘槧灝勶細<T, T,...> ->f0()銆? 鑰屼唬鐮?6錛屼互鍙婁唬鐮?7涓殑T*鐗堟ā鏉匡紝瀹為檯涓婃槸鏋勯犱簡涓涓?lt;Tp>->fp()鐨勬槧灝勩傝繖閲孴p鏄疶鐨勪竴涓瓙闆嗭細Tp={t'|t'=ti*, ti∈T}銆傛崲鍙ヨ瘽璇達紝鐗瑰寲浣挎硾鍨嬩綋緋葷粏鍖栦簡銆傚埄鐢ㄦā鏉跨壒鍖栨妧鏈紝鎴戜滑宸茬粡鑳藉錛堢鎷欏湴錛夊垎杈ㄦ誕鐐規暟銆佹暣鏁般佸唴緗被鍨嬨佸唴緗暟緇勩佺被銆佹灇涓劇瓑絳夌被鍨嬨傚叿澶囦負綾誨瀷鍒掑垎鐨勮兘鍔涳紝涔熷氨鏄瀯閫犱笉鍚岀殑綾誨瀷瀛愰泦鐨勮兘鍔涖? 鐜板湪錛屾垜浠究鍙互鏋勯犱竴涓?#8220;娉涘瀷浣撶郴”錛欸={T} U T U Tp U Ta U Ti U Tf U Tc ...銆傚叾涓紝Tp鏄墍鏈夋寚閽堢被鍨嬶紝Ta鏄暟緇勶紝Ti鏄暣鏁幫紝Tf鏄誕鐐規暟錛孴c鏄被絳夌瓑銆備絾鏄鏋滄垜浠寜鐓ф硾鍖栫▼搴︼紝鎶奊涓殑鍏冪礌鎺掑垪寮錛歿T, Tp, Ta, Ti,...,t1,...,tn}銆傛垜浠細鍙戠幇榪欎腑闂村瓨鍦ㄤ竴浜?#8220;鏂眰”銆傝繖浜涙柇灞備綅浜嶵鍜孴p絳変箣闂達紝浠ュ強Tp絳変笌ti絳変箣闂寸瓑絳夈傝繖琛ㄦ槑鍦–++98/03涓紝鎶借薄浣撶郴涓嶅瀹屾暣錛屽瓨鍦ㄧ己闄楓? 鎵浠ワ紝鍒扮洰鍓嶄負姝紝C++榪樻病鏈夌湡姝g炕瓚婇樋灝斾烤鏂北閲岄偅搴ф渶闄╁郴鐨勫北宄般傝繖姝f槸C++0x姝e湪鍔姏鍋氱殑錛岃屼笖鑳滃埄鍦ㄦ湜銆? 鍦–++0x涓紝澶х墰浠紩鍏ヤ簡first-class鐨刢oncept鏀寔銆俢oncept鐩墠榪樻病鏈夋寮忕殑娉曞畾鎻忚堪錛堜互鍙婂悎鐞嗙殑涓枃緲昏瘧錛夈傞氫織鍦拌錛宑oncept鎻忚堪浜嗕竴涓被鍨嬬殑錛堟帴鍙o級鐗瑰緛銆傝鍏蜂綋鐨勶紝涓涓猚oncept鎻忚堪浜嗙被鍨嬪繀欏誨叿澶囩殑鍏叡鎴愬憳鍑芥暟錛屽繀欏誨叿澶囩殑鏂藉姞鍦ㄨ綾誨瀷涓婄殑鑷敱鍑芥暟錛堝拰鎿嶄綔絎︼級錛屼互鍙婂繀欏誨叿澶囩殑鍏朵粬鐗瑰緛錛堥氳繃闂存帴鎵嬫錛夈備笅闈㈡槸涓涓吀鍨嬬殑concept錛? concept has_equal<T> 榪欎釜concept鍛婅瘔鎴戜滑瀹冩墍鎻忚堪鐨勭被鍨嬪繀欏繪湁涓涓猠qual鎴愬憳錛屼互鍙︿竴涓悓綾誨瀷鐨勫璞′負鍙傛暟銆傚綋鎴戜滑灝嗚繖涓猚oncept鏂藉姞鍦ㄤ竴涓嚱鏁版ā鏉夸笂錛屽茍浣滀負瀵圭被鍨嬪弬鏁扮殑綰︽潫錛岄偅涔堝氨琛ㄦ槑浜嗚繖涓ā鏉垮綾誨瀷鍙傛暟鐨勮姹傦細 template<has_equal T>bool is_equal(T& lhs, T const& rhs) { 濡傛灉瀹炲弬瀵硅薄鐨勭被鍨嬫病鏈塭qual鎴愬憳錛岄偅涔坕s_equal灝嗕細鎷掔粷緙栬瘧閫氳繃錛氳繖涓嶆槸鎴戣鐨勶紒 concept鏄彲浠ョ粍鍚堢殑錛屾寮忕殑鏈鍙仛“refine”銆傛垜浠彲浠ラ氳繃refine榪涗竴姝ユ瀯閫犲嚭綰︽潫鏇村己鐨刢oncept錛? concept my_concept<T> : has_equal<T>, DefaultConstructable<T>, Swappable<T> {} refine鑾峰緱鐨刢oncept灝嗕細“緇ф壙”閭d簺“鍩篶oncept”鐨勬墍鏈夌害鏉熴備綔涓烘洿緇嗚嚧鐨勭粍鍚堟墜孌碉紝concept榪樺彲浠ラ氳繃!鎿嶄綔絎?#8220;鍘繪帀”鏌愪簺鍐呮兜鐨刢oncept綰︽潫錛? concept my_concept1<T> : has_equal<T>, !DefaultConstructable<T> {} 榪欎釜concept瑕佹眰綾誨瀷鍏峰equal鎴愬憳錛屼絾涓嶈兘鏈夐粯璁ゆ瀯閫犲嚱鏁般? 閫氳繃榪欎簺鎵嬫錛宑oncept鍙互“鏃犻檺緇嗗垎”綾誨瀷闆嗗悎T銆傜悊璁轟笂錛屾垜浠彲浠ュ埗閫犱竴榪炰覆鍙浉宸竴涓嚱鏁版垨鑰呭彧鐩稿樊涓涓弬鏁扮殑concept銆? 涓涓猚oncept瀹為檯涓婂氨鏄瀯鎴愮被鍨嬮泦鍚圱鐨勫垝鍒嗙殑綰︽潫錛歍x={ti| Cx(ti)==true, ti∈T}銆傚叾涓瑿x灝辨槸concept鎵鏋勯犵殑綰︽潫銆備笉鍚岀殑concept鏈夌潃涓嶅悓鑼冨洿鐨勭害鏉熴傝繖鏍鳳紝鐞嗚涓婃垜浠彲浠ヨ繍鐢╟oncept鏋氫婦鍑虹被鍨嬮泦鍚?T鐨勬墍鏈夊瓙闆嗐傝岃繖浜涘瓙闆嗗垯姝eソ濉ˉ浜嗕笂榪癎涓殑閭d簺鏂眰銆傛崲鍙ヨ瘽璇達紝concept緇嗗寲浜嗙被鍨嬪垝鍒嗙殑綺掑害錛屾垨鑰呰娉涘瀷鐨勭矑搴︺備嬌寰?#8220;紱繪暎”鐨勬硾鍨嬬郴緇熷彉鎴?#8220;榪炵畫”鐨勩? 褰撴垜浠繍鐢╟oncept綰︽潫涓涓嚱鏁版ā鏉跨殑綾誨瀷鍙傛暟鏃訛紝鐩稿綋浜庣敤concept鎵鎻忚堪鐨勭被鍨嬪瓙闆嗘瀯寤轟竴涓槧灝勶細<Tx1,Tx2,...>->fx()銆傚嚒鏄鍚坱uple <Tx1,Tx2,...>鐨勭被鍨嬬粍鍚堬紝瀵瑰簲fx()銆傛墍浠ワ紝浠庤繖涓搴﹁岃█錛屽嚱鏁版ā鏉跨殑鐗瑰寲錛堝寘鎷琧oncept錛夊彲浠ョ湅浣滃嚱鏁伴噸杞界殑涓縐嶆墿灞曘傚湪concept鐨勪績榪涗笅錛屾垜浠究鍙互鎶婂嚱鏁版ā鏉跨壒鍖栧拰鍑芥暟閲嶈澆緇熶竴鍦ㄤ竴涓綋緋諱笅澶勭悊錛屼嬌鐢ㄥ叡鍚岀殑瑙勫垯瑙f瀽銆? 鍦ㄧ洰鍓嶉樁孌碉紝C++宸笉澶氬凡緇忕櫥涓婁簡“鎶借薄闃垮皵淇炬柉灞?#8221;鐨勯《宄般備絾鏄氨濡傚悓姹夊凹鎷旇繘鍏ユ剰澶у埄鍚庯紝榪橀渶瑕侀潰瀵瑰己鐩涚殑緗楅┈鍏卞拰鍥斤紝涓庝箣浣滄垬閭f牱銆侰++鐨勯潰鍓嶈繕闇瑕佽繘涓姝ュ皢浼樺娍鍖栦綔鑳滃埄銆傝鍋氱殑浜嬭繕寰堝錛屽叾涓渶閲嶈鐨勶紝褰撳睘鏋勫緩Runtime GP銆傜洰鍓岰++鐨凣P鏄紪璇戞椂鏈哄埗銆傚浜庤繍琛屾椂鍐蟲柇鐨勪換鍔★紝榪橀渶瑕佹眰鍔╀簬OOP鐨勫姩澶氭併備絾鏄疌++棰嗗煙鐨勫ぇ鐗涗滑宸茬粡鐫鎵嬪湪Runtime GP鍜孯untime Concept絳夋柟闈㈠睍寮鍔姏銆傝繖鏂歸潰鐨勬渶鏂版垚鏋滃彲浠ョ湅榪欓噷銆?a >榪欓噷鍜?a >榪欓噷銆傜浉淇$粡榪囪嫢騫插勾鐨勫姫鍔涘悗錛孏P灝嗕細瀹屽叏鐨勬垚鐔燂紝鎴愪負鐪熸涓繪祦鐨勭紪紼嬫妧鏈? 鍧庡凹浼氭垬涔嬪悗錛屾眽灝兼嫈宸茬粡鎷ユ湁浜嗙粷瀵圭殑浼樺娍銆傜綏椹漢宸茬粡鎴樿觸錛屼粬鍚岀綏椹煄涔嬮棿宸茬粡娌℃湁浠諱綍寮哄ぇ鐨勬晫瀵瑰姏閲忥紝緗楅┈浜轟篃宸茬粡闂婚涓ц儐錛屽嚑鏃犳枟蹇椼備絾鏄紝姹夊凹鎷斿嵈鐘笅浜嗘垨璁鎬護浠栦竴鐢熷悗鎮旂殑閿欒銆備粬鏀捐繃浜嗙綏椹煄錛岃漿鑰屾敾鍑葷綏椹殑鍗楅儴鍩庨偊鍜屽悓鐩熴備粬浣庝及浜嗙綏椹漢鐨勬剰蹇楋紝浠ュ強緗楅┈鍚岀洘鐨勭墷鍥虹▼搴︺傜綏椹漢寰堝揩緇撴潫浜嗘渶鍒濈殑娣蜂貢錛屼換鍛戒簡鏂扮殑鎵ф斂瀹橈紝閲囩敤浜嗗潥澹佹竻閲庛佷互鏌斿厠鍒氱殑鏂版垬鐣ャ傞殢鐫鏃墮棿鐨勬帹縐伙紝姹夊凹鎷斿拰浠栫殑鍐涢槦闄愪簬瀛ょ珛鏃犳彺鐨勫鍦幫紝琚揩涓轟簡鐢熷瓨鑰屼綔鎴樸傚敖綆¤揩闄嶅茍鍗犻浜嗗嚑涓綏椹煄甯傦紝浣嗘槸緇堢┒鏃犳硶鍐嶆鑾峰緱緇欎簣緗楅┈浜鴻嚧鍛戒竴鍑葷殑鏈轟細銆?/em> 姹夊凹鎷旂殑鎴樼暐閿欒瀹為檯涓婂湪浠庢柊榪﹀お鍩哄煄鍑哄彂涔嬪墠宸茬粡娉ㄥ畾銆傚洜涓烘眽灝兼嫈瀵圭綏椹漢鐨勮繙寰佺殑鏍規湰鐩殑騫墮潪鍑繪簝騫跺崰棰嗙綏椹紝鑰屾槸閫氳繃鎵撳嚮緗楅┈錛屽墛寮變粬浠殑鍔垮姏錛岀摝瑙d粬浠殑鑱旂洘銆備互杈懼埌瀵繪眰絳捐鍜屽鉤鍗忚鐨勭洰鐨勩傜劧鑰岃繖縐嶆湁闄愭垬鐣ュ嵈浣垮鑷翠簡浠栫殑鏈緇堝け璐ャ?/em> 涓嶅垢鐨勬槸錛孋++鎴栧鎴栧皯鍦版湁鐫鍚屾眽灝兼嫈涓鏍風殑鎴樼暐閿欒銆侰++鏈鍒濈殑鐩殑鍩烘湰涓婁粎浠呭眬闄愪簬“鏇村ソ鐨凜”銆傚茍涓斿叏闈㈠吋瀹笴銆傝繖鍦ㄥ綋鏃朵技涔庡緢鍚堢悊錛屽洜涓篊鍙互綆椾綔鏈鎴愬姛鐨?#8220;搴曞眰楂樼駭璇█”錛屾嫢鏈夊緢楂樼殑鎬ц兘鍜岀伒媧繪с備絾鏄紝C鐨勮璁″茍鏈冭檻灝嗘潵浼氭湁涓涓彨鍋?#8220;C++”鐨勮璦鏉ュ鍏惰繘琛屾墿灞曘傜粨鏋滃緢澶氫紭鐐瑰浜嶤鑰岃█鏄紭鐐癸紝浣嗗嵈鎴愪簡C++鐨勮礋鎷呫傛瘮濡傦紝C澶ч噺浣跨敤鎿嶄綔絎﹁〃杈捐娉曠粨鏋勶紝瀵逛簬C鑰岃█鏄懼緱闈炲父綆媧侊紝浣嗗浜嶤++錛屽垯浣垮叾琚揩澶ц妯″鐢ㄦ搷浣滅錛屼負鍏跺悗鍑虹幇鐨勫緢澶氳娉曠己闄峰煁涓嬩簡浼忕瑪銆傝繖涓鐐逛笂錛孉da鍋氬緱鐩稿鎴愮啛浜涖傚畠浠嶱ascal閭i噷緇ф壙浜嗕富瑕佽娉曪紝浣嗕笉鑰冭檻鍏煎銆傝繖浣垮緱Ada鏇村姞瀹屾暣錛屾槗浜庡彂灞曘傛柊璇█灝辨槸鏂拌璦錛岃繃鍒嗙殑鍏煎鏄暎閾愶紝涓嶆槸浼樺娍銆傝屼笖錛屽悎鐞嗗湴緇ф壙璇硶錛屽悓鏍峰彲浠ュ惛寮曚紬澶氬紑鍙戣呫備粠緇忛獙鏉ョ湅錛岀▼搴忓憳瀵逛簬璇硶鍙樺寲鐨勬壙鍙楄兘鍔涜繕鏄緢寮虹殑銆備粬浠洿澶氬湴鍏沖績璇█鐨勫姛鑳藉拰鏄撶敤鎬с?/p>
鍙︿竴鏂歸潰錛孋++鏈鍒濆茍鏈妸鐩爣瀹氬湪“鍒涘緩涓縐嶉珮搴︽娊璞★紝鍙堢‘淇濇ц兘鐨勮璦”銆傜旱瑙侰++鐨勫彂灞曪紝鍚勭鎶借薄鏈哄埗騫墮潪鍦ㄥ畬鏁寸殑瑙勫垝鎴栬礬綰垮浘鐨勬寚瀵間笅鍔犲叆璇█銆傛墍鏈夐珮綰х壒鎬ч兘鏄互“娣繪補鎴樻湳”闆舵墦紕庢暡鍦板姞鍏ヨ璦銆備粠鏌愮紼嬪害涓婃潵鐪嬶紝C++鏇村儚鏄竴縐嶅疄楠屾ц璦錛岃岄潪宸ヤ笟璇█銆侰++鐨勫己澶у姛鑳藉拰浼樼偣鏄暱鏈熺Н绱幏寰楃殑錛岃屽畠鐨勮澶氱己闄蜂篃鏄暱鏈熸坊鍔犵壒鎬х殑緇撴灉銆?/p>
姹夊凹鎷斿拰C++緇欎簣鎴戜滑涓涓緢濂界殑鏁欒銆傚浜庝竴涓瘯鍥懼湪1銆?0騫村悗渚濈劧鍋ュ悍鎴愰暱鐨勮璦錛岄偅涔堝氨蹇呴』鍦ㄦ渶鍒濅究鎷ユ湁鏄庣‘鐨勭洰鏍囧拰鎶鏈彂灞曡鍒掋傚浜庝互寰鐨勮璦鐗規у簲褰撴嫨浼樿屽彇錛屼笉鑳界収鍗曞叏鏀躲傚茍涓斿湪鎶鏈笂鎷ユ湁瓚沖鐨勫墠鐬繪с傛垜浠煡閬擄紝鎶鏈墠鐬繪ф槸寰堥毦鍋氬埌鐨勶紝姣曠珶鎶鏈彂灞曞お蹇傚鏋滃仛涓嶅埌錛岄偅灝卞緱鏈夎凍澶熺殑欖勫姏瀵硅繃鍘葷殑涓滆タ鍔犱互鍙栬垗銆傛墍璋?#8220;鑸嶅皬灝卞ぇ錛屽純瀛愪簤鍏?#8221;銆?/p>
鎬諱綋鑰岃█錛孋++鍦ㄦ娊璞℃満鍒剁殑鍙戝睍鏂歸潰錛岃繕綆楁槸鎴愬姛鐨勩傚敖綆′即闅忕潃涓嶅皯鎶鏈己闄鳳紝浣嗘槸C++鐨勬娊璞¤兘鍔涘湪鍚勭璇█涓彲縐板緱涓婂嚭綾繪嫈钀冦傝屼笖C++榪樺湪鍙戝睍錛屽畠鏈潵灝嗕細鍙戝睍鎴愪粈涔堝艦鎬侊紝涓嶅緱鑰岀煡銆備絾鏄紝鏃犺C++鏄戶緇慨淇ˉ琛ワ紝榪樻槸鏍規湰鎬у湴鍙橀潻錛屽畠鐨勬娊璞¤兘鍔涢兘浼氫笉鎶樹笉鎵e湴淇濈暀錛屽茍涓斾笉鏂畬鍠勫拰澧炲己銆?/p>
鍧庡凹浼氭垬涔嬪悗錛屾眽灝兼嫈鍙堟墦榪囧嚑嬈″皬瑙勬ā鐨勮儨浠椼備絾緇忚繃闀挎湡鐨勪綔鎴橈紝涔熷緱涓嶅埌榪﹀お鍩虹殑鏀彺錛屾眽灝兼嫈鐨勫姏閲忚秺鏉ヨ秺寮憋紝鍙兘鍦ㄦ剰澶у埄鍗婂矝涓婂媺寮虹敓瀛樸傜綏椹緢蹇仮澶嶄簡鍏冩皵錛屾敼闈╀簡鍐涗簨浣撶郴鍜屼綔鎴樻柟寮忥紝閲嶆柊鎺屾彙浜嗘垬鐣ヤ富鍔ㄦ潈銆傛洿閲嶈鐨勬槸錛岀綏椹篃鏈変簡鑷繁鐨?#8220;姹夊凹鎷?#8221;鈥斺旓紙寰佹湇闈炴床鐨勶級鏅竷鍒╀箤鏂?#183;縐戝皵鍐呭埄涔屾柉·瑗垮簢闃匡紙澶цタ搴囬樋錛夈傝タ搴囬樋琚淳寰鍖楅潪澶ч檰錛岀洿鎺ユ敾鍑昏喀澶熀浜虹殑鑰佸發銆傛眽灝兼嫈琚彫鍥烇紝鍦ㄦ墡椹笌瑗垮簢闃挎憜寮闃靛娍錛屽睍寮涓鍦哄喅鎴樸傛渶緇堬紝瑗垮簢闃胯繍鐢ㄤ粠姹夊凹鎷旈偅閲屽鍒扮殑鎴樻湳鍑繪簝浜嗚喀澶熀浜猴紝涓虹綏椹漢璧㈠緱浜嗙浜屾甯冨尶鎴樹簤鐨勮儨鍒┿?/em> 姝ゅ悗錛屾眽灝兼嫈鍦ㄧ綏椹漢鐨勯氱級涔嬩笅錛屾祦浜′簬鍦頒腑嫻鋒部宀革紝璇曞浘瀵繪眰涓滃北鍐嶈搗鐨勬満浼氥備絾鏈緇堟湭鑳藉鎰匡紝琚揩浜庡叕鍏冨墠183騫磋嚜灝斤紝浜勾64宀併傛湁瓚g殑鏄紝浠栫殑鑰佸鎵嬶紝灝忎粬12宀佺殑瑗垮簢闃夸篃浜庡悓騫村幓涓栥備竴涓紵澶х殑浼犲灝辨緇撴潫銆?/em> class IShape { virtual void load(xml init)=0; virtual void draw(monitor m)=0; ... }; 鐒跺悗瀹氫箟鍚勭鍥懼艦綾伙紝騫朵粠榪欎釜鎺ュ彛涓婄戶鎵匡細 class Rectangle: public IShape { void load(xml init) {...} void draw(monitor m) {...} ... }; class Ellipse: public IShape { void load(xml init) {...} void draw(monitor m) {...} ... }; ... void DrawShapes(monitor m, vector<IShape*> const& g) { vector<IShape*>::const_iterator b(g.begin()), e(g.end()); for(; b!=e; ++b) { (*b)->draw(m); } } ... 鐜板湪鍙互浣跨敤榪欎簺鍥懼艦綾諱簡錛?/p>
vector<IShape*> vg; vg.push_back(new Rectangle); vg.push_back(new Ellipse); ... DrawShapes(crt, vg);
閫氳繃鎺ュ彛IShape錛屾垜浠彲浠ユ妸涓嶅悓鐨勫浘褰㈢被緇熶竴鍒頒竴縐嶇被鍨嬩笅銆備絾鏄紝閫氳繃铏氬嚱鏁扮殑override錛岀敱鍥懼艦綾誨疄鐜癐Shape涓婄殑铏氬嚱鏁般傝繖鍙互綆楄?
鐢熷父璋堜簡銆傚姩澶氭佺殑鏍稿績灝辨槸鍒╃敤override鍜宭ate
bound鐨勭粍鍚堬紝浣垮緱涓涓熀綾誨彲浠ュ湪綾誨瀷褰掍竴鍖栫殑鎯呭喌涓嬶紝鎷ユ湁緇ф壙綾葷殑璇箟銆侽OP璁捐妯″紡澶ч噺榪愮敤榪欑鎶鏈紝瀹炵幇寰堝闇瑕佺伒媧繪墿灞曠殑緋葷粺銆?/p>
class Rectangle { void load(xml init) {...} void draw(monitor dev) {...} ... }; class Ellipse { void load(xml init) {...} void draw(monitor dev) {...} ... }; ... void DrawShapes(monitor dev, vector<anything> const& g) { vector<IShape>::const_iterator b(g.begin()), e(g.end()); for(; b!=e; ++b) { (*b).draw(dev); } } ... vector<anything> vg; vg.push_back(Rectangle(...)); vg.push_back(Ellipse(...)); ... DrawShapes(crt, vg); class Rectangle { void load(xml init) {...} void draw(monitor dev) {...} ... }; class Ellipse { void load(xml init) {...} void draw(monitor dev) {...} ... }; ... concept Shape<T> { void T::load(xml init); void T::draw(monitor dev); } ... void DrawShapes(monitor dev, vector<Shape> const& g) { vector<IShape>::const_iterator b(g.begin()), e(g.end()); for(; b!=e; ++b) { (*b).draw(dev); } } ... vector<Shape> vg; vg.push_back(Rectangle(...)); vg.push_back(Ellipse(...)); vg.push_back(string("xxx")); //閿欒錛屼笉絎﹀悎Shape concept ... DrawShapes(crt, vg); 涔嶇湅璧鋒潵娌′粈涔堢壒鍒殑錛屼絾鏄娉ㄦ剰vector<Shape>銆傝繖閲?span style="font-weight: bold;">浣跨敤涓涓猚oncept錛岃屼笉鏄竴涓叿浣撶殑綾誨瀷錛屽疄渚嬪寲涓涓ā鏉?/span>銆傝繖閲岀殑鎰忔濇槸璇達紝榪欎釜瀹瑰櫒鎺ュ彈鐨勬槸鎵鏈夌鍚圫hape concept鐨勫璞★紝綾誨瀷涓嶅悓涔熸病鍏崇郴銆傚綋push榪泇g鐨勫璞′笉絎﹀悎Shape錛屼究浼氬彂鐢熺紪璇戦敊璇?/p>
浣嗘槸錛屾渶鍏抽敭鐨勪笢瑗夸笉鍦ㄨ繖閲屻傛敞鎰忓埌DrawShapes鍑芥暟浜嗗悧錛熺敱浜巚ector<Shape>涓殑鍏冪礌綾誨瀷鍙兘瀹屽叏涓嶅悓銆傝鍙?
(*b).draw(dev);鐨勮涔夊湪闈欐佽璦涓槸闈炴硶鐨勶紝鍥犱負鎴戜滑鏍規湰鏃犳硶鍦ㄧ紪璇戞椂鍏蜂綋紜畾(*b)鐨勭被鍨嬶紝浠庤岄摼鎺ユ紜殑draw鎴愬憳銆傝屽湪榪欓噷錛?
鐢變簬鎴戜滑寮曞叆浜哛untime Unbound錛屽浜庡璞$殑璁塊棶閾炬帴鍙戠敓鍦ㄨ繍琛屾椂銆傚洜姝わ紝鎴戜滑渚垮彲浠ユ妸涓嶅悓綾誨瀷鐨勫璞″瓨鏀懼湪涓涓鍣ㄤ腑銆?/p>
concept鍦ㄨ繖閲岃搗鍒頒簡綾誨瀷媯楠岀殑浣滅敤錛屼笉絎﹀悎鐩稿簲concept鐨勫璞℃槸鏃犳硶鏀懼叆榪欎釜瀹瑰櫒鐨勶紝浠庤屽湪姝ゅ悗瀵瑰璞$殑浣跨敤鐨勬椂鍊欙紝涔熶笉浼氬彂鐢熺被鍨嬪け閰嶇殑
闂銆傝繖涔熷氨鍦ㄥ姩鎬佺殑鏈哄埗涓嬬‘淇濅簡綾誨瀷瀹夊叏銆傚姩澶氭佺‘淇濈被鍨嬪畨鍏ㄤ緷闈犻潤鎬佺被鍨嬨備篃灝辨槸鎵鏈夌被鍨嬮兘浠庝竴涓娊璞℃帴鍙d笂緇ф壙錛屼粠鑰屽皢綾誨瀷褰掍竴鍖栵紝浠ヨ幏寰楀緩绔嬪湪闈?
鎬佺被鍨嬬郴緇熶箣涓婄殑綾誨瀷瀹夊叏銆傝宑oncept鐨勭被鍨嬪畨鍏ㄤ繚璇佹潵婧愪簬瀵圭被鍨嬬壒寰佺殑鎻忚堪錛屾槸涓縐嶉潪渚靛叆鐨勬帴鍙g害鏉燂紝鐏墊椿鎬уぇ澶ч珮浜庣被鍨嬪綊涓鍖栫殑鍔ㄥ鎬併?br> 濡傛灉鎴戜滑寮曞叆榪欐牱涓涓鍒欙細濡傛灉鐢ㄧ被鍨嬪垱寤哄疄渚嬶紙瀵硅薄錛夛紝閭d箞鎵鍒涘緩鐨勫璞℃槸闈欐侀摼鎺ョ殑錛屼篃灝辨槸緙栬瘧鏃墮摼鎺ワ紱鑰岀敤concept鍒涘緩涓涓璞★紝閭d箞鎵鍒涘緩鐨勫璞℃槸鍔ㄦ侀摼鎺ョ殑錛屼篃灝辨槸榪愯鏃墮摼鎺ャ?/p>
鍦ㄨ繖鏉¤鍒欑殑浣滅敤涓嬶紝涓嬮潰榪欐綆鍗曠殑浠g爜灝嗕細浜х敓闈炲父濂囧鐨勬晥鏋滐細 class nShape { public: nShape(Shape g, int n) : m_graph(g), m_n(n) {} void setShape(Shape g) { m_graph=g; } private: Shape m_graph; int m_n; }; 鍦ㄨ鍒欑殑浣滅敤涓嬶紝m_graph鏄竴涓?strong>鍔ㄦ佸璞?/strong>錛屽畠鐨勭被鍨嬪彧鏈夊湪榪愯鏃舵墠鑳芥槑紜備絾鏄棤璁轟粈涔堢被鍨嬶紝蹇呴』婊¤凍Shape concept銆傝宮_n鐨勭被鍨嬫槸紜畾鐨勶紝鎵浠ユ槸涓涓?strong>闈欐佸璞?/strong>銆?/p>
榪欏拰浼犵粺鐨勬ā鏉挎湁鍖哄埆鍚楋紵妯℃澘涔熷彲浠ョ敤涓嶅悓鐨勭被鍨嬪弬鏁板畾涔夋垚鍛樻暟鎹傝鐪嬪涓嬩唬鐮侊細 Rectangle r; Ellipse e; nShape.setShape(e); //瀵逛簬浼犵粺妯℃澘鑰岃█錛岃繖涓搷浣滄槸闈炴硶鐨勶紝鍥犱負e鍜宺涓嶆槸鍚屼竴縐嶇被鍨?/p>
鍔ㄦ佸璞$殑鐗圭偣鍦ㄤ簬錛屾垜浠彲浠ュ湪瀵硅薄鍒涘緩鍚庯紝鐢ㄤ竴涓笉鍚岀被鍨嬬殑鍔ㄦ佸璞′唬鏇垮師鏉ョ殑錛屽彧闇瑕佽繖浜涘璞$鍚堢浉搴旂殑concept銆傝繖鍦ㄩ潤鎬佺殑妯℃澘涓婃槸鍋氫笉鍒扮殑銆?br> 璇█灞傞潰鐨刢oncept鏃犳硶鍋氬埌榪欎簺錛屽洜涓哄畠鏄紪璇戞湡鏈哄埗銆備負姝わ紝鎴戜滑闇瑕佹湁涓縐嶈繍琛屾椂鐨刢oncept錛屾垨鑰呰浜岃繘鍒剁駭鍒殑concept銆?/p>
涓涓猚oncept鍖呭惈浜嗕笌涓涓垨鑻ュ共涓被鍨嬫湁鍏崇殑涓緇勫嚱鏁幫紝鍖呮嫭鎴愬憳鍑芥暟鍜岃嚜鐢卞嚱鏁般備簬鏄紝鎴戜滑灝卞彲浠ョ敤涓涓被浼?#8220;铏氳〃”鐨勫嚱鏁版寚閽堣〃錛堟殏涓旂О涓?
ctable鍚э級瀛樻斁concept鎸囧畾鐨勫嚱鏁版寚閽堛傝繖鏍風殑ctable渚濋檮鍦ㄥ姩鎬佸璞′笂錛屽氨鍍弙table涓鏍楓傛瘡涓璞¢兘浼氬尮閰嶅拰map鍒拌嫢騫蹭釜
concept銆傚洜姝わ紝姣忎釜鍔ㄦ佸璞′細鏈変竴涓猚oncept琛紝鍏朵腑瀛樻斁鐫鎸囧悜鍚刢table鐨勬寚閽堬紝浠ュ強鐩稿簲鐨刢oncept鍩烘湰淇℃伅銆?/p>
褰撲竴涓?#8220;鐢ㄦ埛”錛堝嚱鏁版垨妯℃澘錛夐渶瑕佸湪榪愯鏃墮摼鎺ュ埌瀵硅薄涓婄殑鏃跺欙紝瀹冧細鎻愪氦涓涓猚oncept鐨勪唬鐮侊紙鍏ㄥ眬鍞竴錛夈傜郴緇熺敤榪欎釜浠g爜鍦ㄥ姩鎬佸璞$殑
concept琛ㄤ笂媯绱紝鑾峰緱鎸囧悜鎵闇concept鐨勬寚閽堬紝騫朵笖濉啓鍒?#8220;鐢ㄦ埛”緇欏嚭鐨勪竴涓?#8220;鎻掑叆鐐?#8221;錛堜竴涓寚閽堬級涓傞殢鍚?#8220;鐢ㄦ埛”渚垮彲浠ョ洿鎺ラ氳繃榪欎釜
“鎻掑叆鐐?#8221;闂存帴璋冪敤鎵闇鐨勫嚱鏁幫紝鎴愬憳鎴栬嚜鐢卞嚱鏁般?/p>
鍦ㄨ繖閲岋紝concept鐨勫閥濡欎箣澶勫湪浜庯紝灝嗕竴鏃忓嚱鏁伴泦鍚堝湪涓璧鳳紝浣滀負涓涓暣浣擄紙鍗蟲帴鍙o級銆傞偅涔堬紝鍦ㄦ墽琛岃繍琛屾椂鍖歸厤鐨勬椂鍊欙紝涓嶅啀鏄竴涓嚱鏁頒竴涓嚱鏁板湴鏌ヨ錛?
鍙互涓嬈℃у湴鑾風煡榪欎簺鍑芥暟鏄惁瀛樺湪銆傝繖灝卞緢瀹規槗鍦拌閬夸簡綾誨瀷瀹夊叏淇濊瘉鎿嶄綔鐨勬崯鑰椼傚鏋滀嬌鐢╤ash鏌ヨ錛岄偅涔堝彲浠ュ湪O(1)瀹炵幇concept鍖歸厤銆傚彟
澶栵紝涓涓猚oncept鐨刪ash鍊煎彲浠ュ湪緙栬瘧鏃惰綆楀ソ錛岃繍琛屾椂閾炬帴鍙渶鎵цhash琛ㄦ绱紝榪瀐ash鍊艱綆椾篃鍙互鐪佸幓銆?/p>
涓涓姩鎬佸璞″彲浠ョ洿鎺ョ敤鎸囧悜concept ctable鐨勬寚閽堣〃紺恒傚湪涓嶅悓concept涔嬮棿杞崲錛岀浉褰撲簬鏀瑰彉鎸囬拡鐨勬寚鍚戯紝榪欑鎿嶄綔闈炲父綾諱技OOP涓殑dynamic_cast銆?/p>
瀵逛簬濡備笅鐨勫姩鎬佸璞″畾涔夛細 Shape g=Cycle();
浼氬垱寤轟竴涓狢ycle瀵硅薄錛屽湪瀵硅薄涓婃瀯寤鴻搗涓涓猚oncept琛紝琛ㄤ腑瀵瑰簲Cycle鎵鏈夌鍚堢殑concept銆傚茍涓斿緩绔嬩竴緇刢table錛屾瘡涓?
ctable瀵瑰簲涓涓猚oncept銆傛瘡涓猚oncept琛ㄩ」鎸囧悜鐩稿簲鐨刢table銆傝岀鍙穏鍒欏疄闄呬笂鏄寚鍚戞墍寤虹珛瀵硅薄鐨凷hapes
ctable鐨勬寚閽堛?/p>
瀵逛簬鍑芥暟錛?/p>
void draw(Shape g); draw(g);
璋冪敤g鏃訛紝鐢變簬draw鐨勫弬鏁版槸Shape
concept錛岃実姝f槸draw鎵闇鐨刢oncept錛屾墍浠ユ棤闇鍦ㄥ璞鐨刢oncept琛ㄤ笂鍖歸厤錛屽彲浠ョ洿鎺ヤ嬌鐢ㄨ繖涓猚table鎸囬拡銆傝繖灝辨槸璇達紝鍙
鎵鐢ㄥ姩鎬佸璞★紙g錛夌殑concept鍚屼嬌鐢ㄦ柟錛坉raw鍑芥暟錛夎兘澶熷尮閰嶏紝渚垮彲浠ョ洿鎺ヤ嬌鐢ㄦ寚鍚慶table鐨勬寚閽堥摼鎺ワ紙緙栬瘧鏃墮摼鎺ワ級錛屾棤闇鍦ㄨ繍琛屾椂閲嶆柊鍖?
閰嶃傚彧鏈夊彂鐢焎oncept杞崲鏃訛紝鎵嶉渶瑕佸湪concept琛ㄤ腑鎼滅儲錛岃幏寰楁墍闇鐨刢table鎸囬拡錛?/p>
Swappable s=g; //Swappable鏄彟涓涓猚oncept 榪欑鎯呭喌鍚宒ynamic_cast鏋佸叾鐩鎬技銆備篃鍙互妯′豢鐫閲囩敤concept_cast涔嬬被鐨勬搷浣滅錛屼嬌寰梒oncept杞崲鏄懼紡鍖栵紝娑堥櫎闅愬紡杞崲鐨勯棶棰橈紙寮篶oncept鍖栵級銆?br>
灝忔椂鍊欏惉璇磋繃涓夊彧灝忕尓鐨勬晠浜嬶紝闅愮害璁板緱鏁呬簨鏄涓夊彧灝忕尓鐢ㄤ笉鍚屾柟娉曢犳埧瀛愶紝瀵規姉鑰佺嫾銆傝繖浜涘ぉ鍋氳蔣浠訛紝閬囧埌涓涓棤姣旂畝鍗曠殑闂錛屼絾鍦ㄤ笁縐嶄笉鍚岀殑璇█涓紝鍗存湁鐫鎴劧涓嶅悓鐨勮В娉曘?br>
鏈榪戯紝鍐蜂笉涓佸湴鎺ュ埌鍏徃涓嬫淳鐨勪竴涓揣鎬ヤ換鍔★紝鍋氭墜鎸丳OS鍜孭C紼嬪簭涔嬮棿浜ゆ崲鏁版嵁鐨勭▼搴忋傚悇縐嶅悇鏍風殑楹葷儲涓紝鏈変竴涓皬寰椾笉璧風溂鐨勯棶棰橈紝POS鏈轟腑鏁版嵁鐨勫瓧
鑺傚簭鍜孭C鐩稿弽銆傝繖鍙笉綆楁槸浠涔堝晩銆傛病閿欙紝鏄湪澶畝鍗曚簡銆傚敖綆″姝わ紝榪樻槸寮曞彂浜嗕竴鍦轟簤璁恒傚仛POS紼嬪簭鐨勶紝甯屾湜PC紼嬪簭鍋氳漿鎹€傚仛PC紼嬪簭鐨勶紝甯屾湜POS
紼嬪簭鍋氳漿鎹€傦紙璋侀兘鎯沖皯鍋氱偣錛屽鍚?)錛夈傛渶緇堬紝浣滀負鍜屼簨浣殑鎴戯紝涓轟簡緇存姢鍜岃皭鐨勬皼鍥達紝鎻戒笅浜嗚繖浠朵簨銆傚綋鐒訛紝鍒板簳鍦ㄩ偅閲屽仛錛岃繕鏄鍐沖畾鐨勩傛渶緇堥夋嫨鍦≒C
涓婏紝姣曠珶PC涓婅皟璇曡搗鏉ュ鏄撱傦紙澶╃厼鐨勶紝榪欎釜POS鏈烘病鏈塪ebug錛屼篃娌℃湁妯℃嫙鍣紝鏄劇ず灞忚繕娌℃垜鎵嬫満鐨勫ぇ錛屽仛璧鋒潵鐫瀹炶垂浜嬶級銆?br> 鍏跺疄錛屾垜鐨勬湰鎰忔槸鎯沖湪POS涓婂仛榪欎釜杞崲銆傚洜涓篜OS鐢ㄧ殑鏄疌錛堜竴涓笉鐭ヤ粈涔堝勾浠g殑gcc錛夛紝鍙互鐩存帴鎿嶄綔瀛楄妭銆傚熀鏈殑浠g爜鐪嬭搗鏉ュ樊涓嶅搴旇鏄繖鏍鳳細
unsigned long InvData(unsigned long val, int n) {
unsigned long t=val, res=0;
for(; n >0; n--)
{
res = res << 8;
res |= (unsigned char)t;
t = t >> 8;
}
return res;
}
n鏄暟鎹被鍨嬬殑瀛楄妭闀垮害銆傝繖閲屼嬌鐢ㄤ簡鏈闀跨殑鏃犵鍙鋒暣鏁扮被鍨嬨傝繖鏄牳蹇冭漿鎹㈠嚱鏁幫紝鍚勭綾誨瀷鐨勮漿鎹㈠嚱鏁伴兘鍙互浠庝腑媧劇敓錛?br> long InvDataLong(long val) {
return (long)InvData((unsigned long)val, sizeof(val));
}
short InvDataShort(short val) {
return (short)InvData((unsigned short)val, sizeof(val));
}
...
鏈鍚庯紝鏈変竴涓瘮杈冪壒孌婄殑鍦版柟錛宖loat銆俧loat鐨勭紪鐮佷笉鍚屼簬鏁村瀷錛屽鏋滅洿鎺ョ敤(unsigned
long)寮哄埗綾誨瀷杞崲錛屽彧浼氭妸float鏁板肩殑鏁存暟閮ㄥ垎璧嬩簣鍙傛暟錛屽緱涓嶅埌姝g‘鐨勭粨鏋溿傛紜殑鍋氭硶錛屽簲褰撴槸鎶奻loat鍗犵敤鐨勫洓涓瓧鑺傜洿鎺ユ槧灝勬垚涓涓?
unsigned long錛?br> float InvDataFloat(float val) {
float val=InvData(*(unsigned long*)(&val), sizeof(val));
return *(float*)(&val);
}
閫氳繃灝唂loat鍙橀噺鐨勫湴鍧寮哄埗杞崲鎴恥nsigned long*綾誨瀷錛岀劧鍚庡啀dereference鎴恥nsigned
long綾誨瀷銆傚綋鐒惰繕鏈夊叾浠栧姙娉曪紝姣斿memcpy錛岃繖閲屽氨涓嶅璇翠簡銆傝嚦浜巇ouble綾誨瀷錛屼負浜嗙畝鍖栭棶棰橈紝榪欓噷灝嗗叾蹇界暐銆傚鏋滄湁64浣嶇殑鏁村瀷錛岄偅涔?
double鍙互閲囩敤綾諱技鐨勮В娉曘傚惁鍒欙紝灝卞繀欏誨啓涓撻棬鐨勫鐞嗗嚱鏁般?br> 褰撶劧錛屾渶緇堟垜榪樻槸浣跨敤C#鍐欒繖涓漿鎹€傜浉姣斾箣涓嬶紝C#鐨勮漿鎹唬鐮佹樉寰楁洿鍏風幇浠i鍛熾傚熀鏈畻娉曡繕鏄竴鏍鳳細
public static ulong DataInv(ulong val, int n)
{
ulong v1_ = val, v2_ = 0;
for (; n > 0; n--)
{
v2_ <<= 8;
v2_ |= (byte)v1_;
v1_ >>= 8;
}
return v2_;
}
瀵逛簬涔犳儻浜嶤/C++鐨勫悓瀛︿滑娉ㄦ剰浜嗭紝long/ulong鍦–#涓笉鏄?瀛楄妭錛岃屾槸8瀛楄妭銆備篃灝辨槸C/C++涓殑longlong銆備互榪欎釜鍑芥暟涓哄熀紜錛屽叾瀹冩暣鏁扮被鍨嬬殑瀛楄妭搴忚漿鎹篃灝辨湁浜嗭細
public static ulong DataInv(ulong val)
{
return DataInv(val, sizeof(ulong));
}
public static uint DataInv(uint val)
{
return (uint)DataInv((ulong)val, sizeof(uint));
}
public static int DataInv(int val)
{
return (int)DataInv((uint)val);
}
...
鐒惰岋紝闈㈠float錛屽嚭鐜頒簡楹葷儲銆傚湪C#涓紝娌℃湁鎸囬拡錛屾棤娉曡薄C閭f牱灝唂loat灞曞紑鎴恥long銆傦紙unsafe浠g爜鍙互鎵ц榪欑被鎿嶄綔錛屼絾榪欎笉鏄疌#瀚′翰鐨勭壒鎬э紝騫朵笖鏄繚鑳孋#璁捐鐞嗗康鐨勩傝繖閲屼笉鍋氳冭檻錛夈侰#鎻愪緵浜嗗彟涓縐嶉鏍肩殑鎿嶄綔錛?br> public static float DataInv(float val)
{
float res_ = 0;
byte[] buf_ = BitConverter.GetBytes(val);
byte t = 0;
t = buf_[0];
buf_[0] = buf_[3];
buf_[3] = t;
t = buf_[1];
buf_[1] = buf_[2];
buf_[2] = t;
res_ = BitConverter.ToSingle(buf_, 0);
return res_;
}
榪欎釜鍋氭硶灝界鏈変簺绱禈錛屼絾閬撶悊涓婂緢綆鍗曪細鎶奻loat鍙橀噺杞崲鎴愪竴涓瓧鑺傛祦錛岀劧鍚庢妸鐩稿簲鐨勪綅緗璋冿紝灝辮幏寰椾簡瀛楄妭鍙嶅簭鐨刦loat銆傜浉姣擟鐨刦loat杞?
鎹紝C#鏄庢樉涓嶅綆緇冦傚師鍥犲緢綆鍗曪紝C#鏍規湰涓嶆槸鐢ㄦ潵騫茶繖涓殑銆侰鏄竴縐嶉潪甯稿簳灞傜殑璇█錛屽畠鐨勫唴瀛樻ā鍨嬫槸瀹屽叏鐩磋鐨勶紝涓庣‖浠剁郴緇熺浉瀵瑰簲鐨勩傚洜鑰岋紝瀵逛簬榪欑
涓庢満鍣ㄧ浉鍏崇殑鎿嶄綔錛屽綋鐒朵篃鏄懼緱娓稿垉鏈変綑銆傝孋#瀹氫綅浜庨珮灞傚紑鍙戠殑楂樼駭璇█錛屽簳灞傜殑鍐呭瓨妯″瀷鏄灞忚斀鐨勶紝紼嬪簭鍛樻棤闇鐭ラ亾鍜屽叧蹇冦?br> 涓嶈繃錛孋#鐨勪唬鐮佸嵈鎷ユ湁瀹冪殑浼樺娍銆傚彧闇鐪嬩竴鐪艱繖浜涘嚱鏁扮殑浣跨敤浠g爜錛屼究涓嶈█鑷槑浜嗭細
//C浠g爜
int x=234;
float y=789.89;
short z=332;
x=InvDataInt(x);
y=InvDataFloat(y);
z=InvDataShort(z);
//C#浠g爜
int x=234;
float y=789.89;
short z=332;
x=DataInv(x);
y=DataInv(y);
z=DataInv(z);
鍦–浠g爜涓紝瀵逛簬涓嶅悓鐨勭被鍨嬶紝闇瑕佷嬌鐢ㄤ笉鍚屽懡鍚嶇殑鍑芥暟銆傝屽湪C#浠g爜涓紝鍒欏彧闇浣跨敤DataInv榪欐牱涓涓嚱鏁板悕銆傝嚦浜庡眾鏃墮夌敤閭d釜鐗堟湰鐨勫嚱鏁幫紝緙栬瘧鍣ㄤ細
鏍規嵁瀹為檯鐨勭被鍨嬭嚜鍔ㄥ尮閰嶃侰#榪愮敤鍑芥暟閲嶈澆榪欎釜鐗規э紝浣垮緱璋冪敤浠g爜鍙互閲囩敤緇熶竴鐨勫艦寮忋傚嵆渚挎槸鏁版嵁鐨勭被鍨嬫湁鎵鍙樺寲錛屼篃鏃犻渶瀵硅皟鐢ㄤ唬鐮佸仛浠諱綍淇敼銆傦紙榪欏湪鎴?
鐨勫紑鍙戣繃紼嬩腑鐨勫緱鍒頒簡楠岃瘉錛屼紶杈撴暟鎹殑鎴愬憳綾誨瀷鏇劇粡鍙戠敓鍙樺寲錛屾垜涔熷彧鏄慨鏀逛簡鏁版嵁緇撴瀯鐨勫畾涔夛紝渚垮皢闂鎼炲畾錛夈傝繖涓鐐癸紝鍦–涓槸鏃犳硶鍋氬埌鐨勩?br> 褰掔粨璧鋒潵錛孋鐢變簬渚ч噸浜庡簳灞傦紝鍦ㄦ暟鎹漿鎹㈡柟渚跨殑鐏墊椿鎬э紝浣垮緱杞崲浠g爜鐨勬瀯寤烘洿鍔犲鏄撱傝孋#鍒欏緱鐩婁簬鍑芥暟閲嶈澆錛屽湪杞崲浠g爜浣跨敤鏂歸潰錛屾湁鐙埌鐨勪紭鍔褲?br> 榪勪粖涓烘錛屼笁鍙皬鐚腑錛岃繕鍙湁涓ゅ彧鍑虹幇銆備笅闈㈠氨瑕佺涓夊彧鍑哄満浜嗐?br> 浣滀負C++鐨勭矇涓濓紝鎴戜細鑷劧鑰岀劧鍦版兂鍒頒嬌鐢–++鏉ュ疄鐜拌繖涓漿鎹㈠姛鑳姐備簬鏄究鏈変簡濡備笅鐨勪唬鐮侊細
unsigned long InvData(unsigned long val, int n) {
unsigned long t=val, res=0;
for(; n >0; n--)
{
res = res << 8;
res |= (unsigned char)t;
t = t >> 8;
}
}
long InvData(long val) {
return (long)InvData((unsigned long)val, sizeof(val));
}
short InvData(short val) {
return (short)InvData((unsigned short)val, sizeof(val));
}
...
float InvData(float val) {
float val=InvData(*(unsigned long*)(&val), sizeof(val));
return *(float*)(&val);
}
榪欎簺浠g爜灝卞ソ璞℃槸C鍜孋#浠g爜鐨勬潅浜ゅ悗浠c傛棦鏈塁鐨勫簳灞傛搷浣滐紝涔熸湁C#鐨勫嚱鏁伴噸杞斤紝鍏兼湁涓よ呯殑浼樼偣銆?br> 涓嶈繃錛岃繕鑳藉仛寰楁洿濂斤細
template<typename T>
T InvData(T val) {
T t=val, res=0;
int n=sizeof(T);
for(; n >0; n--)
{
res = res << 8;
res |= (unsigned char)t;
t = t >> 8;
}
return (T)res;
}
榪欐牱錛屽氨鎶婃墍鏈夌殑鏁村瀷閮戒竴緗戞墦灝戒簡錛屼粎鐢ㄤ竴涓嚱鏁版ā鏉匡紝渚垮畬鎴愪簡鍘熷厛璇稿鍑芥暟鎵鍋氱殑宸ヤ綔銆傝宖loat鐗堟湰鐨勫嚱鏁板垯淇濇寔涓嶅彉錛屼綔涓篒nvData()鐨勪竴涓噸杞姐傛寜鐓++鐨勫嚱鏁版ā鏉?閲嶈澆瑙勫垯錛宖loat鐗堢殑鍑芥暟閲嶈澆灝嗚浼樺厛浣跨敤銆?br>
濂戒簡錛屼笁鍙皬鐚殑鏁呬簨璁插畬浜嗐傚墠涓ゅ彧灝忕尓鍚勬湁浼樼偣錛屼篃鍚勬湁緙虹偣銆傝岀涓夊彧灝忕尓鍒欐潅鍚堝拰鍓嶄袱鑰呯殑浼樼偣錛屽茍涓斿叿鏈夋洿澶х殑榪涙銆傚敖綆$涓夊彧灝忕尓瀛樺湪鍚勭鍚勬牱鐨勭己闄鳳紝浣嗘瘯绔熷畠鐨勪紬澶氱壒鎬т負鎴戜滑甯︽潵浜嗗緢澶氭晥鐜囧拰鏂逛究錛岃繖浜涜繕鏄簲褰撳煎緱鑲畾鐨勩?
闄勶細絎笁鍙皬鐚殑鍏朵粬鎵嬫錛?br>1銆佸己鍒惰漿鎹㈡垚瀛楃涓叉暟緇?br>template<typename T>
T InvData1(T v) {
unsigned char* pVal1=(unsigned char*)(&v)
, *pVal2=pVal1+sizeof(T)-1, t;
while(pVal2-pVal1>1)
{
t=*pVal2;
*pVal2=*pVal1;
*pVal1=t;
pVal1++;
pVal2--;
}
return v;
}
2銆佷嬌鐢ㄦ爣鍑嗗簱錛宐log涓婃湁浜虹暀璦寤鴻鐨?br>template<typename T>
T InvData(T v) {
unsigned char* pVal=(unsigned char*)(&v);
size_t n=sizeof(T);
std::reverse(pVal, pVal+n, pVal);
}
3銆佷嬌鐢╰raits
template<size_t n> struct SameSizeInt;
template<> struct SameSizeInt<1> { typedef unsigned char Type; };
template<> struct SameSizeInt<2> { typedef unsigned short Type; };
template<> struct SameSizeInt<4> { typedef unsigned long Type; };
template<> struct SameSizeInt<8> { typedef unsigned longlong Type; };
template<typename T>
T InvData(T v) {
size_t n=sizeof(T);
typedef SameSizeInt<sizeof(T)>::Type NewT;
NewT v1=*(NewT*)(&v), v2=0;
for(; n >0; n--)
{
v2= v2<< 8;
v2|= (unsigned char)v1;
v1 = v1 >> 8;
}
return *(T*)(&v2);
}
鐢氳嚦鍙互浣跨敤tmp鍘繪帀鍏朵腑鐨勫驚鐜傚湪C++涓紝榪欑被浠誨姟鐨勫疄鐜版柟娉曪紝瀹屽叏鐪嬬▼搴忓憳鐨勬兂璞″姏浜嗐?)
C++鐨勫鏉傛槸鍏鐨勶紝灝界鎴戣涓哄湪浜虹被鐨勮仾鏄庢櫤鎱т箣涓嬶紝榪欑偣澶嶆潅鍘嬫牴鍎跨畻涓嶄笂浠涔堛備笉榪囨垜寰楁壙璁わ紝瀵逛簬涓鑸殑搴旂敤鑰岃█錛孋++瀵圭▼搴忓憳浜х敓鐨勫帇鍔涜繕鏄笉
灝忕殑銆傛瘯绔熺幇鍦ㄦ湁鏇村鏇村悎閫傜殑閫夋嫨銆備粎浠呮壙璁ゅ鏉傦紝榪欐病鏈変粈涔堟剰涔夈傛垜涓嶆椂鍦頒駭鐢熶竴涓康澶達細鏈変粈涔堝姙娉曟棦淇濈暀C++鐨勪紭鐐癸紝鑰屾秷闄ゅ畠鐨勭己鐐瑰拰澶嶆潅銆傛垜鐭ラ亾
D璇█鍦ㄥ仛榪欐牱鐨勪簨鎯呫備絾鏄紝D鏇村鍦版槸鍦ㄥ氨浜嬭浜嬪湴娑堥櫎C++鐨勭己闄鳳紝鑰屾病鏈夊湪鏍規湰涓婃秷闄ょ己闄峰拰澶嶆潅鎬с?br id="n4.f"> 涓鑸岃█錛屼竴鏍蜂笢瑗垮鏉備簡錛屽熀鏈笂閮芥槸鍥犱負涓滆タ澶銆傚緢鏄劇劧錛孋++鐨勮璦鐗規у湪浼楀璇█涓槸鏁頒竴鏁頒簩鐨勩備簬鏄紝鎴戜究鎯沖埌鎴栬鎶奀++鍙樻垚“C--”錛屽彲浠ユ不濂紺++鐨勫鏉備箣鐥呫傚湪鎺㈣榪欎釜闂涔嬪墠錛岃鎴戜滑鍏堜粠C鍑哄彂錛岀湅鐪婥++涓轟綍濡傛澶嶆潅銆?br id="nt0i">
C鍜孋++
灝界瀛樺湪榪欐牱閭f牱鐨勪笉瓚籌紝姣斿non-lalr鐨勮娉曘侀殣寮忕殑鎸囬拡綾誨瀷杞崲絳夛紝浣咰璇█鐨勮璁″摬瀛﹀嵈鏄凍澶熺粡鍏哥殑銆侰璇█鏈変竴涓潪姝e紡鐨勫垎綾伙紝璁や負瀹冩棦闈?a title="姹囩紪" id="rkk6">姹囩紪榪欐牱鐨?a title="浣庣駭璇█" id="zr4u">浣庣駭璇█錛屼篃闈?a title="Pascal" id="xrbx">Pascal閭f牱鐨?a title="楂樼駭璇█" id="ncnx">楂樼駭璇█錛?
鑰屽簲璇ョ畻浣滀腑綰ц璦錛屼粙浜庡叾浠栦袱綾昏璦涔嬮棿銆傝繖縐嶅垎綾繪伆濡傚叾鍒嗗湴鐐瑰嚭浜咰璇█鐨勭壒鐐瑰拰鐞嗗康錛氫互楂樼駭璇█璇硶褰㈠紡鎵胯澆浜嗕綆綰ц璦鐨勭紪紼嬫ā鍨嬨備綆綰ц璦鐨勭壒鐐?
鏄彲浠ョ洿鎺ュ湴鎻忚堪紜歡緋葷粺鐨勭粨鏋勩侰鍒欑戶鎵夸簡榪欎釜鐗圭偣銆侰璇█鐩磋鍦板弽鏄犱簡紜歡鐨勯昏緫鏋勯狅紝姣斿鏁扮粍鏄唴瀛樺潡錛屽彲浠ョ瓑浠蜂簬鎸囬拡銆傚湪C璇█涓紝鎴戜滑鍙互鍑犱箮
鐩存帴鐪嬪埌紜歡鐨勬瀯閫狅紝騫朵笖鍔犱互鎿嶄綔銆傝繖浜涚壒鎬у浜庡簳灞傚紑鍙戣嚦鍏抽噸瑕併?br id="a8ed">
鐒惰岋紝C鐨勮繖縐嶇洿瑙傜畝媧佺殑妯″瀷榪囦簬搴曞眰鍜岀悙紕庯紝涓嶅埄浜庡簲鐢ㄥ湪閭d簺鏋勯犲鏉傘佸彉鍖栧鏍風殑搴旂敤涓傞拡瀵笴鐨勮繖浜涘急鐐癸紝Bjarne
Stroustrup鍐沖績鍒╃敤OOP鎶鏈C璇█榪涜鏀歸狅紝浠庤屼績浣夸簡C++鐨勮癁鐢熴侰++鍏ㄩ潰錛堝嚑涔?00%錛夊湴鍏煎C錛岃瘯鍥句互姝ゅ湪涓嶆崯澶盋璇█鐨勭洿瑙?
鍜岀畝媧佺殑鎯呭喌涓嬶紝鍚屾椂鍏峰鏇村己鐨勮蔣浠跺伐紼嬬壒鎬э紝浣垮叾鍏峰寮鍙戝ぇ鍨嬪鏉傜郴緇熺殑浼樺娍銆傝繖涓洰鏍?#8220;鍑犱箮”杈懼埌浜嗭紝浣嗘槸浠d環棰囦負鍙銆?br id="dyop">
鍦ㄧ粡鍘嗕簡80銆?0騫翠唬鐨勮緣鐓屼箣鍚庯紝C++鐨勫簲鐢ㄩ鍩熷紑濮嬮姝ャ備竴鏂歸潰錛屽湪搴曞眰搴旂敤鏂歸潰錛孋++鐨勫緢澶氱壒鎬ц璁や負鏄浣欑殑銆傚鏋滀笉浣跨敤榪欎簺鐗規э紝閭d箞
C++鍒欏悓C娌℃湁浠涔堝樊鍒傜浉鍙嶈繖浜涚壒鎬х殑浣跨敤錛屽寮鍙戝洟闃熺殑鏁翠綋鑳藉姏鎻愬嚭浜嗘洿楂樼殑瑕佹眰銆傚洜鑰岋紝鍦ㄦ渶搴曞眰錛屽緢澶氫漢鏀懼純浜咰++鑰屽洖褰掍簡C錛屽洜涓洪偅浜涢珮綰х壒
鎬у茍鏈甫鏉ュ緢澶氬府鍔╋紝鍙嶈屼駭鐢熶簡寰堝璐熸媴銆傚彟涓鏂歸潰錛屽湪楂樺眰寮鍙戜腑錛屼笟鍔¢昏緫鍜岀晫闈篃鏃犻渶閭d箞澶氬簳灞傜殑鐗規у拰鑻涘埢鐨勬ц兘瑕佹眰錛屾洿澶氱畝鍗曟柟渚褲佷笂鎵嬪鏄撶殑璇?
璦鐩告瘮C++鏇村姞閫傚悎銆侰++鐨勫簲鐢ㄨ鍘嬬緝鍦ㄤ腑闂村眰錛岄殢鐫涓氱晫緋葷粺綰у紑鍙戠殑涓嶆柇涓撲笟鍖栵紝C++鐨勪嬌鐢ㄨ妯′篃浼氳秺鏉ヨ秺灝忋傦紙褰撶劧錛屽畠鎵寮鍙戠殑搴旂敤寰寰閮芥槸鍏?
閿х殑錛屽茍涓旀槸娌℃湁閫夋嫨浣欏湴鐨勶級銆傚疄闄呬笂錛孋++鍦ㄨ繖涓眰闈篃騫墮潪瀹岀編鐨勫伐鍏楓傜洰鍓嶆棤娉曞彇浠f槸鍥犱負娌℃湁鐩稿悓綰у埆鐨勬浛浠e搧銆侱鎴栬鏄釜寮烘湁鍔涚殑绔炰簤鑰咃紝浣嗕竴
鏂歸潰鍑轟簬鍘嗗彶閬楃暀浠g爜鐨勮妯″拰搴旂敤鎯э紝鍙︿竴鏂歸潰D涔熷茍鏈畬鍏ㄨВ鍐矯++闈復鐨勫鏉傛ч棶棰橈紝D涔熷緢闅懼湪鍙鐨勫皢鏉ュ彇浠++銆?br id="mof4">
瀹為檯涓婏紝C++鐨勮繖縐嶅按灝湴浣嶆湁鐫鏇存繁灞傛鐨勫師鍥犮侰++鐨勬湰鎰忔槸鍦ㄤ繚鐣機鐨勫簳灞傜壒鎬у熀紜涓婏紝澧炲姞鏇村ソ鐨勮蔣浠跺伐紼嬬壒鎬с備絾鏄紝C++浜嬪疄涓婂茍鏈湡姝f剰涔変笂
鍦頒繚鐣機鐨勫簳灞傜壒鎬с傚洖欏句竴涓婥鐨勮璁$悊蹇碘斺旂洿瑙傝岀畝媧佸湴鍙嶆槧搴曞眰紜歡鐨勭壒鎬с侰++閫氳繃鍏煎C鑾峰緱浜嗚繖縐嶈兘鍔涖備絾鏄繖閲屾湁涓棶棰橈紝濡傛灉鎴戣鑾峰緱C鐨勮繖
縐嶇畝鍗曠洿瑙傛э紝灝卞繀欏繪斁寮僀++涓殑寰堝楂樼駭鐗規с傝繖閲屾渶鏄庢樉鐨勪竴涓緥瀛愪究鏄痯od錛?a title="plain old data" id="ogl:">plain old data錛夈?br id="rz7y">
鍦–涓帇鏍規病鏈塸od鐨勬蹇碉紝鍥犱負鎵鏈夌殑瀵硅薄閮芥槸pod銆備絾鏄紝C++涓湁浜唒od銆傚洜涓篊++鐨勫璞″彲鑳戒笉鏄竴涓猵od錛岄偅涔堟垜浠究鏃犳硶璞″湪C褰撲腑閭f牱
鑾峰緱鐩磋綆媧佺殑鍐呭瓨妯″瀷銆傚浜巔od錛屾垜浠彲浠ラ氳繃瀵硅薄鐨勫熀鍦板潃鍜屾暟鎹垚鍛樼殑鍋忕Щ閲忚幏寰楁暟鎹垚鍛樼殑鍦板潃錛屾垨鑰呭弽榪囨潵銆備絾鍦ㄩ潪pod瀵硅薄涓紝鍗存棤娉曡繖涔堝仛銆?
鍥犱負C++鐨勬爣鍑嗗茍鏈闈瀙od瀵硅薄鐨勫唴瀛樺竷灞浣滃嚭瀹氫箟錛屽洜鑰屽浜庝笉鍚岀殑緙栬瘧鍣紝瀵硅薄甯冨眬鏄笉鍚岀殑銆傝屽湪C涓紝浠呬粎浼氬洜涓哄簳灞傜‖浠剁郴緇熺殑宸紓鑰屽獎鍝嶅璞″竷
灞銆?br id="sbek">
榪欎釜闂閫氬父騫朵笉鏄捐屾槗瑙併備絾鍦ㄥ緢澶氭儏鍐典笅涓烘垜浠埗閫犱簡涓嶅皬鐨勯殰紕嶃傛瘮濡傦紝瀵硅薄鐨勫簭鍒楀寲錛氭垜浠瘯鍥懼皢涓涓璞′互浜岃繘鍒舵祦鐨勫艦寮忎繚瀛樺湪紓佺洏涓佹暟鎹簱涓紝鎴?
鑰呭湪緗戜笂浼犺緭錛屽鏋滄槸pod錛屽垯鐩存帴灝嗗璞′粠鍩哄湴鍧寮濮嬶紝鎸夊璞$殑澶у皬澶嶅埗鍑烘潵錛屾垨浼犺緭錛屾垨瀛樺偍錛岄潪甯告柟渚褲備絾濡傛灉鏄潪pod錛岀敱浜庡璞$殑涓嶅悓閮ㄥ垎鍙兘瀛?
鍦ㄤ簬涓嶅悓鐨勫湴鏂癸紝鍥犺屾棤娉曠洿鎺ュ鍒訛紝鍙兘閫氳繃鎵嬪伐鍔犲叆搴忓垪鍖栨搷浣滀唬鐮侊紝渚靛叆寮忓湴璇誨彇瀵硅薄鏁版嵁銆傦紙榪欎釜闂涓嶄粎浠呭瓨鍦ㄤ簬C++錛屽叾浠栬璦錛屽java銆丆#
絳夐兘瀛樺湪銆傚彧鏄畠浠病鏈夊緢寮虹儓鐨勬ц兘瑕佹眰錛屽彲浠ヤ嬌鐢ㄨ濡俽eflect絳夋墜孌靛姞浠ュ鐞嗭級銆傚悓鏍風殑闂涔熷瓨鍦ㄤ簬璇稿hash鍊肩殑璁$畻絳夋柟闈€傝繖瀵瑰緢澶氬紑鍙戝伐
浣滈犳垚涓嶅皬鐨勫獎鍝嶏紝涓嶄粎浠呭湪搴曞眰錛屼篃鍖呮嫭寰堝楂樺眰鐨勫簲鐢ㄣ?br id="tnen"> 絀跺叾鍘熷洜錛孋++浠呬粎璇曞浘閫氳繃鏈烘鍦板皢C鐨勫簳灞傜壒鎬у拰OOP絳夐珮灞傜壒鎬ф販鍚堝湪涓璧鳳紝鎰忓浘杈懼埌涓ゆ柟鍏奸【鐨勭洰鐨勩備絾鏄紝浜嬩笌鎰胯繚錛?a title="OOP" id="s_.7">OOP鐨?
寮曞叆瀹為檯涓婁嬌寰桟鐨勭紪紼嬫ā鍨嬪拰鍏朵粬鏇撮珮綰х殑鎶借薄妯″瀷鏃犳硶鍏煎銆傚湪浣跨敤C++鐨勮繃紼嬩腑錛岃涔堝彧浣跨敤C鐨勭壒鎬э紝鑰屾棤娉曡幏寰椾唬鐮佹娊璞″拰瀹夊叏鎬ф柟闈㈢殑濂藉錛岃涔堟斁
寮僀鐨勭洿瑙傜畝媧侊紝鑰岃幏寰楅珮灞傛鐨勬娊璞¤兘鍔涖傚弽鑰岋紝鐢變簬C鍜孫OP緙栫▼妯″瀷涔嬮棿鐨勭煕鐩撅紝澶уぇ澧炲姞浜嗚璦鐨勫鏉傛у拰緙洪櫡鏁般?br id="fqu1">
鑸嶅純
浣嗘槸錛屾垜浠彲浠ョ湅鍒板湪C++涓紝騫墮潪鎵鏈夌殑楂樼駭鐗規ч兘涓嶤鐨勫簳灞傜壒鎬х浉鍐茬獊銆傚緢澶氫嬌鐢–鑰屼笉鍠滄C++鐨勪漢閮借〃紺鴻繃浠栦滑鍘熸剰鎺ュ彈OB錛屼篃灝辨槸浠呬粎浣跨敤灝佽 銆傚浜?a title="RAII" id="typ4">RAII錛屽熀鏈笂涔熸寔鑲畾鐨勬佸害銆傛垨璁鎬篃浼氭帴鍙?a title="緇ф壙" id="ew-b">緇ф壙錛屼絾涔熻〃闇插嚭瀵硅繖縐嶆妧鏈甫鏉ョ殑澶嶆潅鎬х殑鎷呭績銆?a title="鍔ㄥ鎬? id="zmfi">鍔ㄥ鎬?/a>鏄槑鏄懼彈鍒版帓鏂ョ殑鎶鏈傛樉鐒惰繖鏄洜涓哄姩澶氭佺牬鍧忎簡C鐨勭紪紼嬫ā鍨嬶紝浣垮緱寰堝鏈潵綆鍗曠殑闂澶嶆潅鍖栥備笉鏄畠涓嶅ソ錛屾垨鑰呮病鐢紝鏄畠鎵撶牬浜嗗お澶氱殑涓滆タ銆?br id="hbzx"> 鍥犺岋紝鎴戜滑璁炬兂涓涓嬶紝濡傛灉鎴戜滑鍘婚櫎鍔ㄥ鎬佺壒鎬э紝閭d箞鏄惁浼氭秷闄よ繖綾婚棶棰樺憿錛熸垜浠竴姝ユ鐪嬨?br id="pa4y"> 鍔ㄥ鎬佺殑涓涓熀鏈敮鎾戞妧鏈槸铏氬嚱鏁?/a>銆傚湪浣跨敤铏氬嚱鏁扮殑鎯呭喌涓嬶紝綾葷殑姣忎竴嬈$戶鎵塊兘浼氫駭鐢熶竴涓?a title="铏氬嚱鏁拌〃" id="i67i">铏氬嚱鏁拌〃錛坴table錛夛紝鍏朵腑瀛樻斁鐨勬槸鎸囧悜铏氬嚱鏁扮殑鎸囬拡銆傝繖浜涜櫄鍑芥暟琛ㄥ繀欏誨瓨鏀懼湪瀵硅薄浣撲腑錛屼篃灝辨槸鍜屽璞$殑鏁版嵁瀛樻斁鍦ㄤ竴璧鳳紙鑷沖皯瑕佸叧鑱斿湪涓璧鳳級銆傚洜鑰岋紝瀵硅薄鍦ㄥ唴瀛橀噷騫朵笉鏄互榪炵畫鐨勬柟寮忓瓨鏀撅紝鑰岃鍒嗗壊鎴愪笉鍚岀殑閮ㄥ垎錛岀敋鑷寵韓棣栧紓澶勶紙璇﹁銆?a title="Inside c++ object model" id="zduz">Inside C++ Object Model銆嬶級銆傝繖渚塊犳垚浜嗗墠闈㈡墍璇寸殑闈瀙od楹葷儲銆備竴鏃︽斁寮冭櫄鍑芥暟鍜寁table錛屽璞$殑鍐呭瓨甯冨眬涓紝渚夸笉浼氭湁涓滆タ灝嗗璞″垎鍓插紑銆傛墍鏈夌殑瀵硅薄鐨勬暟鎹瓨鍌ㄩ兘鏄繛緇殑錛屽洜鑰岄兘鏄痯od銆傚湪榪欎竴鐐逛笂錛岄氳繃鍘婚櫎vtable錛屼嬌寰楄璦鍥炲綊浜咰鐨勭洿瑙傚拰綆鍗曘?br id="lcim">
鍔ㄥ鎬佺殑鍐呭褰撶劧涓嶄粎浠呮槸涓涓櫄鍑芥暟錛屽彟涓涓噸瑕佺殑鍩虹煶鏄戶鎵褲傚綋鐒訛紝鎴戜滑騫朵笉鎵撶畻鏀懼純緇ф壙錛屽洜涓哄畠騫朵笉鐩存帴鐮村潖C鐨勭洿瑙傛у拰綆媧佹с備笉鍚屼簬铏氬嚱鏁幫紝緇ф壙
涓嶆槸瀹屽叏涓轟簡鍔ㄥ鎬佽岀敓鐨勩傜戶鎵挎渶鍒濈殑鐢ㄩ斿湪浜庝唬鐮佸鐢ㄣ傚綋瀹冭璧嬩簣浜嗗鎬佸惈涔夊悗錛屾墠浼氭垚涓哄姩澶氭佺殑鍩虹銆備互涓嬬殑浠g爜鍙互鏈変袱縐嶄笉鍚岀殑瑙h錛?br id="m_a7"> class B : public A {};
浠?a title="浠g爜澶嶇敤" id="ba2m">浠g爜澶嶇敤鐨勮搴︽潵鐪嬶紝B緇ф壙鑷狝錛岃〃紺烘垜鎵撶畻璁〣澶嶇敤A鐨勬墍鏈変唬鐮侊紝騫朵笖澧炲姞鍏朵粬鍔熻兘銆傝屼粠澶氭佺殑瑙掑害鏉ョ湅錛孊鏄竴涓狝鐨勬墿灞曪紝B鍜孉涔嬮棿瀛樺湪is-a鐨?
鍏崇郴銆傦紙B鏄竴涓狝錛夈備袱鑰呮槸绔欏湪涓嶅悓灞傞潰鐪嬪緟鍚屼竴涓棶棰樸備唬鐮佸鐢紝浠h〃浜嗙紪鐮佺殑瑙傜偣錛岃屽鎬侊紝鍒欎唬琛ㄤ簡涓氬姟閫昏緫鐨勮鐐廣備絾鏄紝涓よ呭茍闈炲疄璐ㄤ笂鐨勪竴鍥?
浜嬨傚湪寰堝鎯呭喌涓嬶紝鍩虹被寰寰浣滀負緇ф壙綾葷殑鏌愮浠h〃錛屾垨鑰呮帴鍙o紝榪欏湪緙栫爜瑙掑害鏉ョ湅騫舵病鏈夊絳夌殑鐞嗚В銆傝岃繖縐嶆帴鍙d綔鐢紝鍒欐槸鍔ㄥ鎬佺殑鍩虹銆傚姩澶氭侀氳繃涓嶅悓鐨勭被
緇ф壙鑷悓涓涓熀綾伙紝浣垮畠浠嫢鏈夊叡鍚岀殑鎺ュ彛錛屼粠鑰屽彲浠ヤ嬌鐢ㄧ粺涓鐨勫艦寮忓姞浠ユ搷浣溿備綔涓轟竴涓瀬绔紝interface錛堟垨鑰呰鎶借薄鍩虹被錛夛紝浠呬粎鎷ユ湁鎺ュ彛鍑芥暟錛堝嵆vtable錛夎屼笉鍖呭惈浠諱綍鏁版嵁鎴愬憳銆傝繖鏄函綺圭殑鎺ュ彛銆?br id="g88s">
鐒惰岋紝榪欓噷瀛樺湪涓涓己闄楓備竴涓帴鍙f墍浠h〃鐨勬槸涓緇勭被錛屽畠灝嗘垚涓鴻繖涓緇勭被鍚屽鐣屼氦浜掔殑鍏卞悓鐣岄潰銆備絾鏄紝浣跨敤鍩虹被銆佹垨鑰呮娊璞″熀綾諱綔涓烘帴鍙o紝瀹炶川涓婃槸鍦ㄤ嬌鐢ㄤ竴涓?
綾誨瀷鏉ヤ唬琛ㄤ竴緇勭被鍨嬨傛墦涓瘮鏂癸紝涓緹や漢鍑戝湪涓璧峰嚭鍘繪梾娓革紝鎴戜滑縐頒粬浠繖緹や漢涓?#8220;鏃呰鍥?#8221;銆傛垜浠煡閬撴梾琛屽洟涓嶆槸涓涓漢錛岃屾槸涓涓笉鍚屼簬“浜?#8221;鐨勬蹇點傚姩澶氭?
閲岀殑鎺ュ彛鐩稿綋浜庢妸涓涓梾琛屽洟褰撲綔涓涓漢鏉ョ湅寰呫傚敖綆¤繖鍙槸閫昏緫涓婄殑錛屾垨璁鎬竴涓梾琛屽洟鐨勫緢澶氳涓哄拰涓涓漢棰囦負鐩鎬技銆備絾鏄牴鏈笂鑰岃█錛屼袱鑰呮瘯绔熶笉鏄浉鍚屽眰嬈$殑
姒傚康銆傝繖鏍風殑澶勭悊鏂規硶寰寰浼氬甫鏉ヤ簡寰堝寮婄銆?br id="ddpi"> 涓轟簡浣跨戶鎵胯璧嬩簣鐨勮繖閲嶄綔鐢ㄥ彂鎸ヤ綔鐢紝榪橀渶瑕佷竴欏歸潪甯稿叧閿殑澶勭悊錛氱被鍨嬭漿鎹€傝鐪嬩互涓嬩唬鐮侊細
void func(A* a);
B b;
func(&b);
鏈鍚庤繖琛屼唬鐮佹柦琛屼簡鍔ㄥ鎬侊紝濡傛灉B
override浜咥鐨勮櫄鍑芥暟鐨勮瘽銆傚緢鏄劇劧錛屽鏋滀弗鏍煎湴浠庡己綾誨瀷瑙掑害鑰岃█錛?amp;b鏄笉搴斿綋浣滀負func鐨勫疄鍙傦紝鍥犱負涓よ呯被鍨嬩笉鍖歸厤銆備絾鏄鏋滄嫆緇濇帴
鍙?amp;b浣滀負瀹炲弬錛岄偅涔堝姩澶氭佸皢鏃犳硶榪涜涓嬪幓銆傚洜姝わ紝鎴戜滑鏀懼浜嗙被鍨嬭漿鎹㈢殑闄愬埗錛氬厑璁哥戶鎵跨被瀵硅薄鐨勫紩鐢ㄦ垨鎸囬拡闅愬紡鍦拌漿鎹㈡垚鍩虹被鐨勫紩鐢ㄦ垨鎸囬拡銆傝繖鏍鳳紝
褰㈠func(&b);渚垮彲浠ラ『鐞嗘垚绔犲湴鎴愪負鍚堟硶鐨勪唬鐮併?br id="hcgc"> 鐒惰岋紝榪欎篃鏄湁浠d環鐨勶細
B ba[5];
func(ba);
鍚庨潰榪欒鍑芥暟璋冪敤瀹為檯涓婃槸涓涓瀬鍏跺嵄闄╃殑閿欒銆傚亣璁懼湪func()涓紝灝嗗艦鍙俛浣滀負涓涓被鍨婣鐨勬暟緇勫寰咃紝閭d箞褰撴垜浠嬌鐢╞a浣滀負瀹炲弬璋冪敤func()鐨?
鏃跺欙紝浼氬皢ba浣滀負A鐨?
鏁扮粍澶勭悊銆傛垜浠煡閬擄紝鏁扮粍鍐呴儴鍏冪礌鏄揣鎸ㄧ潃鐨勶紝絎簩涓厓绱犵殑浣嶇疆鏄涓涓厓绱犵殑鍩哄潃鍔犱笂鍏冪礌鐨勫昂瀵革紝浠ユ綾繪帹銆傚鏋滀紶閫掕繘鏉ョ殑瀵硅薄鏁扮粍鏄疊綾誨瀷鐨勶紝鑰岃浣?
涓篈綾誨瀷澶勭悊錛岄偅涔堜袱鑰呯殑鍏冪礌浣嶇疆灝嗗彲鑳戒笉鍚屾銆傚敖綆緇ф壙鑷狝錛屼絾鏄疊鐨勫昂瀵稿緢鏈夊彲鑳藉ぇ浜嶢錛岄偅涔堜粠絎簩涓厓绱犺搗錛宎[1]鐨勫湴鍧騫墮潪ba[1]鐨勫湴
鍧銆備簬鏄紝褰撴垜浠互a[1]璁塊棶ba鏃訛紝瀹為檯涓婂緢鍙兘鍦╞a[0]鐨勫唴閮ㄦ煇涓綅緗鍙栵紝鑰宖unc()鐨勪唬鐮佽繕浠ヤ負鏄湪鎿嶄綔ba[1]銆傝繖渚挎槸C++涓殑
涓涓噸瑕佺殑闄烽槺鈥斺斿璞″垏鍓層傝繖縐嶉敊璇浉褰撻殣钄斤紝鍗遍櫓鎬ф瀬澶с?br id="nl9g">
鐢變簬C++璇曞浘淇濈暀C鐨勭紪紼嬫ā鍨嬶紝鍥犺屼繚鐣欎簡鎸囬拡-鏁扮粍鐨勭瓑浠鋒с傝繖縐嶇瓑浠鋒т綋鐜頒簡鏁扮粍鐨勬湰璐ㄣ傝繖鍦–涓槸涓欏瑰埄鍣紝騫舵棤浠諱綍闂銆備絾鍦–++涓紝鐢變簬瀛?
鍦ㄤ簡緇ф壙錛屼互鍙婄戶鎵跨被鐨勯殣寮忕被鍨嬭漿鎹紝浣垮緱榪欑鍘熸湰婊嬭ˉ鐨勭壒鎬ф垚涓轟簡涓鍓傛瘨鑽傛崲鍙ヨ瘽璇達紝C++鎵寮曞叆鐨勫姩澶氭佺牬鍧忎簡C鐨勭洿瑙傛с?br id="movc">
鑸嶅純涔嬪悗
浠庝笂闈㈢殑鍒嗘瀽鏉ョ湅錛屽姩澶氭佸悓C鐨勭紪紼嬫ā鍨嬫槸涓嶇浉瀹圭殑銆傚洜鑰屽鏋滃笇鏈涘緱鍒癈鐨勭洿瑙傛э紝騫朵笖娑堥櫎C++鐨勭己闄鳳紝蹇呴』鏀懼純鍔ㄥ鎬佽繖涓壒鎬с傜幇鍦ㄦ潵鐪嬬湅鏀懼純涔嬪悗灝嗕細鎬庢牱銆?br id="vfq0">
涓鏃︽斁寮冧簡鍔ㄥ鎬侊紝涔熷氨鏀懼純浜嗚櫄鍑芥暟鍜寁table銆傛鏃訛紝鎵鏈夌殑瀵硅薄閮芥槸pod浜嗐傞偅涔堥褰撳叾鍐茬殑濂藉錛屽氨鏄彲浠ヨ繘琛岄潪渚靛叆鐨勫簭鍒楀寲銆乭ash璁$畻絳夌瓑
鎿嶄綔銆傜敱浜庡璞¤偗瀹氭槸榪炵畫鍒嗗竷鐨勶紝鍙互鐩存帴鍦板皢瀵硅薄鍙栧嚭榪涜緙栫爜銆佸瓨鍌ㄣ佽綆楀拰浼犺緭錛岃屾棤闇浜嗚В瀵硅薄鍐呴儴鐨勬暟鎹粨鏋勫拰鍚箟銆傚彟澶栦竴涓噸瑕佺殑闂涔熶細寰楀埌瑙?
鍐籌紝榪欏氨鏄疉BI銆傚湪C涓粺涓鐨凙BI寰堣嚜鐒跺湴瀛樺湪浜庤璦涓傛垜浠彲浠ュ緢瀹規槗鍦扮敤link灝嗕袱涓笉鍚岀紪璇戝櫒緙栬瘧鐨勬ā鍧楄繛鎺ヨ搗鏉ワ紝鑰屼笉浼氬彂鐢熼棶棰樸備絾
鏄紝C++涓仛涓嶅埌錛岄櫎闈炰笉鍐嶄嬌鐢ㄧ被鑰屼嬌鐢ㄧ函C銆傜洰鍓岰++榪樻病鏈夌粺涓鐨凙BI錛屽嵆渚挎爣鍑嗗鍛樹細鏈夋剰寤虹珛榪欐牱鐨勮鑼冿紝瀹炵幇璧鋒潵涔熺粷闈炴槗浜嬨備絾鏄紝濡傛灉鏀懼純
鍔ㄥ鎬佷箣鍚庯紝瀵硅薄鐨勫竷灞渚垮洖褰掑埌C鐨勫艦鎬侊紝浠庤屼嬌寰桝BI涓嶅啀鎴愪負涓涓棶棰樸?br id="v898">
鍙︿竴鏂歸潰錛岄殢鐫鍔ㄥ鎬佺殑鍙栨秷錛岄偅涔堢戶鎵跨殑浣滅敤琚粎浠呭眬闄愪簬浠g爜澶嶇敤錛屼笉鍐嶅叿鏈夋瀯閫犳帴鍙g殑浣滅敤銆傛垜浠墠闈㈠凡緇忕湅鍒幫紝緇ф壙綾誨悜鍩虹被鐨勯殣寮忚漿鎹紝鏄負浜嗕嬌鍩虹被鑳?
澶熼『鍒╁湴鎴愪負緇ф壙綾葷殑鎺ュ彛銆傛棦鐒舵斁寮冧簡鍔ㄥ鎬侊紝閭d箞涔熷氨鏃犻渶鍩虹被鍐嶆壙鎷呮帴鍙g殑浠誨姟銆傞偅涔堢敱緇ф壙綾誨悜鍩虹被鐨勯殣寮忕被鍨嬭漿鎹篃鍙互琚姝細
void func(A* a);
B b;
func(&b); //緙栬瘧閿欒錛岀被鍨嬩笉鍖歸厤
榪涜屽璞″垏鍓蹭篃涓嶄細鍙戠敓錛?br id="g8k2"> B ba[5];
func(ba); //緙栬瘧閿欒錛岀被鍨嬩笉鍖歸厤
灝界鏍規嵁鏁扮粍-鎸囬拡鐨勭瓑浠鋒э紝ba鍙互琚殣寮忓湴杞崲涓築*錛屼絾鏄疊*涓嶅啀鑳藉闅愬紡鍦拌漿鎹負A*錛屼粠鑰岄伩鍏嶄簡瀵硅薄鐨勫垏鍓層?br id="p.36"> 闂鏄紝濡傛綆鍗曞湴灝嗗姩澶氭佹斁寮冩帀錛屽氨濡傚悓灝嗘按鍜屽瀛愪竴璧鋒臣鎺夐偅鏍鳳紝瀹為檯涓婃斁寮冧簡鍔ㄥ鎬佸甫鏉ョ殑濂藉銆傚疄闄呬笂騫墮潪濡傛銆傛垜浠斁寮冨姩澶氭佽繖涓壒鎬э紝浣嗗茍涓嶆墦綆楁斁寮冨畠鎵鍏鋒湁鐨勫姛鑳斤紝鑰屾槸鐢ㄥ彟涓縐嶆妧鏈姞浠ユ浛浠c傝繖渚挎槸runtime concept錛?a title="榪欓噷" id="rcy-">榪欓噷鍜?a title="榪欓噷" id="s1fo">榪欓噷錛夈?br id="ww1_"> 涓嶅悓浜庝互綾誨瀷涓哄熀紜鐨刬nterface錛?a title="concept" id="y8et">concept鏄嫭绔嬩簬綾誨瀷鐨勭郴緇熴俢oncept鐢熸潵渚挎槸涓轟簡鎻忚堪涓緇勭被鍨嬶紝鍥犺屾槸鎺ュ彛鏈鐞嗘兂鐨勫疄鐜版墜孌點傚綋concept runtime鍖栦箣鍚庯紝渚垮叿鏈変簡涓庡姩澶氭佺浉鍚岀殑鍔熻兘錛堝緢澶氭柟闈㈣繕鏈夋墍瓚呰秺錛夈?br id="cx1s">
runtime
concept鍚屾牱闇瑕佺被浼紇table鐨勫嚱鏁板垎媧捐〃錛屼絾鐢變簬瀹冧笉鏄被鍨嬶紝榪欎簺鍒嗘淳琛ㄦ棤闇瀛樻斁鍦ㄥ璞″唴閮紝鍙互鐙珛鏀劇疆錛堝彲浠ュ悓RTTI淇℃伅鏀懼湪涓璧鳳級錛?
騫朵笖鍙渶涓浠姐傛鏄熀浜庤繖涓壒鎬э紝鏂規墠淇濊瘉浜嗘墍鏈夊璞′緷鐒舵槸pod錛屼緷鐒惰兘澶熶繚璇佸璞″竷灞鐨勭洿瑙傛с?br id="w6r."> 鍚屾牱錛宺untime concept鎵挎媴浜嗘帴鍙g殑浠誨姟錛屼絾涓嶈薄鍔ㄥ鎬侀偅鏍蜂緷璧栦簬緇ф壙鍜岀浉搴旂殑闅愬紡綾誨瀷杞崲銆傦紙閫氳繃鑷姩鎴栨墜鍔ㄧ殑concept_map錛夈傚洜鑰岋紝鎴戜滑渚濇棫鍙互紱佹鍩轟簬緇ф壙鍏崇郴鐨勯殣寮忕被鍨嬭漿鎹紝浠庤岄槻姝㈠璞″垏鍓茬殑鎯呭喌銆?br id="xorp">
涓鏃︿嬌鐢╟oncept浣滀負澶氭佺殑瀹炵幇鎵嬫錛屽弽鍊掍績浣垮師鏈姩澶氭佺殑涓浜涢夯鐑﹀緱鍒版秷闄ゃ傚湪鍔ㄥ鎬佷腑錛屽繀欏繪寚瀹歷irtual鍑芥暟銆傚姝わ紝鍦ㄤ竴涓被涓細瀛樺湪涓?
縐嶄笉鍚屽艦鎬佺殑鍑芥暟錛屽疄鐜板姩澶氭佺殑铏氬嚱鏁幫紝鍜屾棤姝ゅ姛鑳界殑鏅氬嚱鏁般傚噯紜湴緇存姢榪欐牱涓ょ鍑芥暟錛岄鏈変簺闅懼害銆傝屼笖錛屽嚱鏁版槸铏氳繕鏄笉铏氾紝鐗墊秹鍒扮郴緇熺殑璁捐錛屽繀欏誨湪
鏈鍒濇瀯寤烘椂紜畾錛屽惁鍒欎互鍚庡緢闅句慨鏀廣備絾鍦ㄦ斁寮冨姩澶氭侊紝浣跨敤concept鐨勬儏鍐典笅錛屽彧瑕佷竴涓戶鎵跨被涓紝浣跨敤鐩稿悓鐨勭鍚嶈鐩栧熀綾諱腑鐨勫嚱鏁幫紝渚垮疄鐜頒簡澶氭併傚綋
榪涜concept_map錛屽嵆灝嗘帴鍙d笌綾葷粦瀹氭椂錛屽彧浼氳冭檻緇ф壙綾葷殑鍑芥暟錛岃屽拷鐣ュ熀綾諱腑琚鐩栫殑鍑芥暟銆備簬鏄紝鍙渶綆鍗曠殑瑕嗙洊錛屼究瀹炵幇浜嗗鎬佺殑鎺у埗銆傚浜庢槸
鍚﹀鎬佷竴涓嚱鏁幫紝鍗蟲槸鍚︽敼鍙樺熀綾誨嚱鏁扮殑琛屼負錛屽畬鍏ㄧ敱緇ф壙綾繪帶鍒訛紝鍦ㄥ垱寤哄熀綾繪椂涓嶅繀涓烘浼ょ銆傚叾緇撴灉灝辨槸錛屾垜浠棤闇鍦ㄧ郴緇熻璁$殑鏈鍒濅竴鍒誨氨鎿嶅績澶氭佺殑闂錛?
鑰屽彧闇鏍規嵁瀹炵幇鐨勯渶瑕侀殢鏃跺疄鐜般?br>
鍏朵粬
瀛樺湪澶ч噺闅愬紡杞崲涔熸槸C++甯稿彈浜鴻療鐥呯殑涓涓柟闈紝錛堢壒鍒槸閭d簺Pascal緋葷殑紼嬪簭鍛橈級銆傞殣寮忚漿鎹㈢殑鐩殑鏄甫鏉ユ柟渚匡紝浣垮緱緙栫爜鏇村姞綆媧侊紝鍑忓皯鍐椾綑銆傚悓鏃朵篃浣垮緱涓浜涙妧宸у緱浠ユ柦琛屻備絾鏄紝闅愬紡杞崲鐨勫壇浣滅敤涔熼涓哄彲瑙傘傛瘮濡傦細
void fun(short a);
long a=1248;
fun(a); //欏跺涓涓鍛?br id="q8u5"> 榪欑杞崲瀛樺湪涓ら潰鎬э細涓鏂歸潰錛屽畠鍙兘鏄悎鐞嗙殑錛屽洜涓哄敖綆綾誨瀷long澶т簬short錛屼絾寰堝彲鑳藉瓨鏀劇潃short鍙綰崇殑鏁板鹼紱浣嗗彟涓鏂歸潰錛宎鐨勭‘瀛樺湪short鏃犳硶瀹圭撼鐨勫彲鑳芥э紝榪欎究浼氶犳垚涓涓潪甯擱殣钄界殑bug銆?br id="nxhy1">
C/C++瀵規鐨勭瓥鐣ユ槸鎶婇棶棰樻墧緇欑▼搴忓憳澶勭悊錛屽鏋滄湁bug閭f槸紼嬪簭鍛樼殑闂銆傝繖涔熺畻寰椾笂鍚堟儏鍚堢悊錛屾瘯绔熸湁鎵寰楀繀鏈夋墍澶憋紝涔熺鍚圕/C++鐨勪竴璐悊蹇點備絾
緇堢┒涓嶆槸鏈鐞嗘兂鐨勬柟寮忋備絾鏄鏋滆薄Pascal閭f牱灝嗙被鍨嬬寰楀緢姝伙紝閭d箞璇█鍙堜細澶卞幓鐏墊椿鎬э紝浣垮緱寮鍙戠殑澶嶆潅鎬у鍔犮?br id="c_mt"> 濡傛灉璇曞浘紱佹闅愬紡綾誨瀷杞崲錛岄偅涔堜負浜嗙淮鎸佸嚱鏁頒嬌鐢ㄤ唬鐮佺殑綆媧佹э紝鍑芥暟蹇呴』瀵規墍鏈夌殑綾誨瀷鎵ц閲嶈澆銆傝繖澶уぇ澧炲姞浜嗗嚱鏁板疄鐜扮殑璐熸媴錛屽茍涓旈噸澶嶇殑浠g爜涓ラ噸榪濊儗浜?a title="DRY" id="b0w.">DRY鍘熷垯銆?br id="bmkt"> 鐜板湪鎴栬瀛樺湪涓浜涢斿緞錛屼嬌寰楀湪緇存寔緇濆寮虹被鍨嬬殑鎯呭喌涓嬭幏寰楁墍甯屾湜鐨勭伒媧繪с傞挜鍖欏彲鑳戒緷鐒跺湪concept鎵嬩笂銆傝冭檻濡備笅鐨勪唬鐮侊細
void fun(Integers a);
long a=1248;
fun(a);
longlong b=7243218743012;
fun(b);
姝ゅ錛宖un()鏄竴涓嚱鏁幫紝瀹冪殑褰㈠弬鏄竴涓猚oncept錛屼唬琛ㄤ簡鎵鏈夌殑鏁村瀷銆傝繖鏍鳳紝榪欎釜鍑芥暟渚垮彲浠ユ帴鍙椾換浣曚竴縐嶆暣鍨嬶紙鎴栬呭叿鏈夋暣鍨嬭涓虹殑綾誨瀷錛夈傛垜浠?
鐩鎬俊錛屽湪涓鑸殑搴旂敤涓嬶紝浠諱綍鏁存暟閮芥湁瀹屽叏鐩稿悓鐨勮涓恒傚洜姝わ紝鎴戜滑渚垮彲浠ュ緢鏂逛究鍦頒嬌鐢↖ntegers榪欎釜鎺ュ彛鎵ц瀵規暣鏁扮殑鎿嶄綔錛岃屾棤闇鍏沖績鍒板簳鏄粈涔堟牱鐨?
鏁存暟銆?br id="u-s_"> 濡傛錛屾垜浠究鍙互鍦ㄧ姝㈤殣寮忕被鍨嬭漿鎹紝涓嶄嬌鐢ㄥ嚱鏁伴噸杞界殑鎯呭喌涓嬶紝瀹屾垚榪欑鍑芥暟鐨勭紪鍐欍傚悓鏃跺彲浠ュ緱鍒版洿濂界殑綾誨瀷瀹夊叏鎬с?br id="g9tf">
寮哄埗綾誨瀷杞崲鏄潪甯擱噸瑕佺殑鐗規э紝鐗瑰埆鏄湪搴曞眰寮鍙戞椂銆備絾涔熸槸鍙屽垉鍓戯紝寰寰寮曟潵寰堥殣钄界殑閿欒銆傚己鍒剁被鍨嬭漿鎹㈠緢澶氭儏鍐典笅鏄棤鐞嗙殑錛岄氬父閮芥槸杞歡鐨勮璁¢棶棰橀犳垚鐨勩備絾緇堢┒榪樻槸鏈変竴浜涙儏鍐碉紝闇瑕佸畠鏉ュ鐞嗐?br id="xhcm">
璁炬兂榪欐牱涓涓満鏅細涓や釜涓妯′竴鏍風殑綾誨瀷錛屼絾瀹冧滑鍒嗗睘涓嶅悓鐨勫嚱鏁般傦紙榪欑鎯呭艦灝界涓嶅瑙侊紝浣嗚繕鏄瓨鍦ㄧ殑銆傝繖寰寰鏄販涔辮璁$殑緇撴灉銆傚綋鐒朵篃鏈夊悎鐞嗙殑鎯呭喌錛屾瘮濡?
鏉ヨ嚜涓や釜涓嶅悓搴撶殑綾誨瀷錛夈傛垜鐜板湪闇瑕佸啓涓涓嚱鏁幫紝鑳藉鍚屾椂浣跨敤榪欎袱涓被鍨嬨傛瘮杈冨畨鍏ㄤ竴浜涚殑錛屽彲浠ョ敤鍑芥暟閲嶈澆銆備絾鏄袱涓噸杞界殑鍑芥暟浠g爜鏄竴鏍風殑錛屽吀鍨嬬殑鍐椾綑
浠g爜銆傚綋鐒朵篃鍙互閽堝鍏朵腑涓涓粨鏋勭紪鍐欎唬鐮侊紝鐒跺悗鍦ㄤ嬌鐢ㄦ椂錛屽鍙︿竴涓粨鏋勭殑瀹炰緥鎵ц寮哄埗綾誨瀷杞崲銆備絾鏄紝寮哄埗綾誨瀷杞崲姣曠珶涓嶆槸浠跺ソ浜嬨傚洜姝わ紝鎴戜滑涔熷彲浠ユ瀯
閫犱竴涓猚oncept錛岃瀹冩弿榪拌繖涓や釜綾誨瀷銆傜劧鍚庡湪緙栧啓鍑芥暟鏃朵嬌鐢ㄨ繖涓猚oncept錛屽綋榪欎袱涓被鍨嬮兘涓巆oncept緇戝畾鍚庯紝渚垮彲浠ョ洿鎺ヤ嬌鐢ㄨ繖涓や釜綾?
鍨嬶紝鑰屾病鏈夌被鍨嬪畨鍏ㄥ拰浠g爜鍐椾綑鐨勯棶棰樸?br id="dins">
錛堥『渚挎彁涓涓嬶紝榪欑鏂瑰紡涔熷彲浠ヨ繍鐢ㄥ湪綾誨瀷涓嶅悓鐨勬儏鍐典笅銆傛瘮濡備袱涓被鍨嬩笉瀹屽叏鐩稿悓錛屼絾鏄熀鏈绱犻兘涓鏍楓傞偅涔堝氨鍙互浣跨敤concept_map鐨勯傞厤鍔熻兘錛?
灝嗕袱涓被鍨嬬粺涓鍦ㄤ竴涓猚oncept涓嬨傝繖縐嶆柟寮忕浉姣攐op鐨凙dapter妯″紡錛屾洿鍔犵畝媧併俛dapter鏈韓鏄竴涓猚ontainer錛屽畠鎵瀹炵幇鐨勬帴
鍙e嚱鏁幫紝閮藉繀欏諱竴涓杞彂鍒板唴閮ㄧ殑瀵硅薄錛岀紪鍐欒搗鏉ョ浉褰撶箒鐞愩備絾鍦╟oncept_map涓紝瀵逛簬閭d簺絎﹀悎concept鎻忚堪鐨勫嚱鏁版棤闇鍙﹁澶?
鐞嗭紝concept浼氳嚜鍔ㄥ尮閰嶏紝鍙渶瀵歸偅浜涗笉絎﹀悎瑕佹眰鐨勫嚱鏁版墽琛岄傞厤銆傦級
鍓嶉潰璇磋繃錛屾寚閽堟暟緇勭殑絳変環鎬т綋鐜頒簡涓縐嶇洿瑙傜殑緙栫▼妯″瀷銆備絾鏄紝鎸囬拡鍜屾暟緇勬瘯绔熻繕鏄瓨鍦ㄥ緢澶氬樊鍒紝姣斿鎸囬拡浠呬粎琛ㄨ揪浜嗕竴緇勫璞″湪鍐呭瓨涓殑浣嶇疆錛屼絾騫舵湭鎼哄甫瀵硅薄鏁伴噺鐨勪俊鎭傚洜鑰岋紝褰撴暟緇勯鍖栨垚鎸囬拡鏃訛紝渚垮凡緇忓け鍘諱簡鏁扮粍鐨勮韓浠斤細
void func(int* x);
int a[20];
func(a);
榪欓噷錛屽湪鍑芥暟func涓凡緇忔棤娉曞皢a浣滀負鏁扮粍澶勭悊錛屽洜涓烘棤娉曠煡閬撳彉鎴恑nt*鍚庣殑a鏈夊澶ф潵閬垮厤瓚婄晫銆傜敋鑷蟲垜浠棤娉曟妸a浣滀負澶氫釜瀵硅薄鏋勬垚鐨勫唴瀛樺潡鐪嬪緟錛屽洜涓烘垜浠笉鐭ラ亾澶у皬銆傚洜姝わ紝鍙湁鏄懼紡鍦扮粰鍑烘暟緇勫ぇ灝忥紝鎵嶈兘浣跨敤錛?br id="v51o"> void func(int* x, long size);
浣嗘槸錛屽湪concept鐨勪綔鐢ㄤ笅錛屾暟緇勫拰鎸囬拡寰椾互渚濈劧淇濇寔瀹冧滑鐨勭瓑浠鋒х殑鎯呭喌涓嬶紝瑙e喅鏁扮粍閫鍖栭棶棰樸傝冭檻榪欐牱涓や釜鍑芥暟錛?br id="ihaq"> void func1(Pointer x);
void func2(Container x);
鍏朵腑錛孭ointer鏄唬琛ㄦ寚閽堢殑concept錛岃孋ontainer鍒欐槸浠h〃瀹瑰櫒鐨刢oncept銆傚繀欏繪敞鎰忕殑鏄紝Pointer鏄弗鏍兼剰涔変笂鐨勬寚
閽堬紝涔熷氨鏄鏃犳硶鍦≒ointer涓婃墽琛岃凱浠f搷浣溿侾ointer鍙兘浣滀負鎸囬拡浣跨敤錛屽彧鍏峰dereference鐨勮兘鍔涳紙寰堝儚java鐨?#8220;鎸囬拡”錛屼笉鏄?
鍚楋紵concept鍦ㄦ病鏈夋斁寮僀鐨勫簳灞傜壒鎬х殑鎯呭喌涓嬩篃鍋氬埌浜嗐傦級銆傝孋ontainer鍒欐槸涓撻棬鐢ㄦ潵琛ㄨ揪瀹瑰櫒鐨刢oncept錛屽叾鍩烘湰鐨勭壒鎬т究鏄凱浠c傚湪
func1涓紝鏃犳硶瀵瑰艦鍙倄鎵ц榪唬錛屼粎浠呭皢鍏朵綔涓烘寚鍚戜竴涓璞$殑鎸囬拡澶勭悊錛屼繚璇佸叾瀹夊叏鎬с傝屽浜庨渶瑕佽繘琛岃凱浠f搷浣滅殑func2鑰岃█錛寈鍒欐槸鍙互閬嶅巻鐨勩?
浜庢槸錛屽浜庡悓涓涓暟緇刟錛屼袱涓嚱鏁板垎鍒粠涓嶅悓鐨勮搴﹀鍏惰繘琛屽鐞嗭細
int a[20];
func1(a); //a鐩存帴浣滀負鎸囬拡澶勭悊錛屼絾涓嶈兘榪唬
func2(a); //a浣滀負瀹瑰櫒澶勭悊錛屽彲浠ヨ凱浠o紝騫朵笖鍏跺昂瀵鎬俊鎭篃涓鍚屼紶鍏?br id="sq1o0">
姝ゅ瀹為檯涓婃槸鍒╃敤浜哻oncept瀵圭被鍨嬬壒鎬х殑鎻忚堪浣滅敤錛屽皢鍏鋒湁涓ら噸鎬х殑鏁扮粍綾誨瀷錛堟暟緇刟鍗充唬琛ㄤ簡鏁扮粍榪欎釜瀹瑰櫒錛屼篃浠h〃浜嗘暟緇勭殑璧峰鍦板潃錛変互涓嶅悓鐗瑰緛鍔犱互
琛ㄨ揪錛屼互婊¤凍涓嶅悓搴旂敤鐨勯渶姹傘傛暟緇勪粛鐒跺彲浠ラ鍖栨垚鎸囬拡錛孋鐨勭洿瑙傛ā鍨嬪緱鍒頒繚鐣欙紝鍦ㄥ緢澶氱壒孌婄殑鍦哄悎鍙戞尌浣滅敤銆備絾鍦ㄥ叾浠栧簲鐢ㄥ満鏅紝鍙互鏇村姞瀹夊叏鍦頒嬌鐢ㄦ暟緇勩?br id="u6hz">
鎬葷粨
緇間笂鎵榪幫紝C++鏈兘鐪熸寤剁畫C鐨勭洿瑙傜畝媧侊紝涓昏鏄敱浜庡姩澶氭佺殑涓浜涘熀紜璁炬柦鐮村潖浜咰鐨勭紪紼嬫ā鍨嬨傚洜鑰岋紝鎴戜滑鍙互閫氳繃鏀懼純鍔ㄥ鎬侊紝鍙婂叾鐩稿叧鐨勪竴浜涙妧鏈紝浠?
涔嬩互鏇村姞“鍜岃皭”鐨剅untime
concept錛屼嬌寰桟++鍦ㄥ熀鏈繚鐣機鐨勭紪紼嬫ā鍨嬬殑鍚屾椂錛岃幏寰椾簡鐩告瘮鍘熸潵鏇村ソ鐨勮蔣浠跺伐紼嬬壒鎬с傝嚦姝わ紝榪欑鏀瑰彉鍚庣殑C++錛堝鏋滆繕鑳界О涓篊++鐨勮瘽錛夋嫢鏈?
濡備笅鐨勪富騫茬壒鎬э細
1銆丼P錛屾潵鑷簬C銆?br id="anaw"> 2銆佸畬鍏╬od鍖栥?br id="anaw0"> 3銆丱B銆備繚鐣欎簡灝佽鍜孯AII銆傚敖綆′篃淇濈暀浜嗙戶鎵匡紝浣嗗叾浣滅敤浠呴檺浜庝唬鐮佸鐢紝紱佹鍩轟簬緇ф壙鐨勯殣寮忕被鍨嬭漿鎹€?br id="anaw1"> 4銆丟P錛屽寘鎷瑂tatic鍜宺untime concept銆傝繖鏄娊璞¢珮綰х壒鎬х殑鏍稿績鍜屽熀鐭熾?br id="f0qf3"> 榪欐牱鐨勮璦鐗規у疄璐ㄤ笂姣旂幇鏈夌殑C++鏇村姞綆媧侊紝浣嗘槸鍏惰兘鍔涙洿鍔犲己澶с備篃姣擟++鏇存槗浜庤創榪慍鐨勭紪紼嬫ā鍨嬶紝浠ヤ究閫傚簲搴曞眰鐨勫紑鍙戙傛垜涓嶈兘璇磋繖鏍風殑鍙樺寲鏄惁浼氫駭鐢熶竴涓洿濂界殑璇█錛屼絾鏄垜鐩鎬俊榪欎簺鐗規ф湁鍔╀簬鏋勯犳洿鍔犲潎琛$粺涓鐨勮璦銆?
GP鎶鏈殑灞曟湜鈥斺斿厛鏈夐縛閽у悗鏈夊ぉ
鑾崕鏋?br>
鑷粠楂樼駭璇█鍑虹幇浠ユ潵錛岀被鍨嬪緇堟槸璇█鐨勬牳蹇冦傚嚑涔庢墍鏈夎璦鐗規ч兘瑕佷互綾誨瀷浣滀負鍏堝喅鏉′歡銆傜被鍨嬬姽濡傚ぉ鍦幫紝鍏堜簬涓囩墿鑰屽瓨鍦ㄣ備絾鏄紝鏄惁榪樻湁浠涔堜笢瑗挎瘮綾誨瀷鏇村姞鍘熷錛屾洿鍔犳湰璐紝鑰屽厛浜庡畠瀛樺湪鍛紵璇峰線涓嬬湅銆?)
娉涘瀷鍜岀被鍨?/h3>
娉涘瀷鏈綆鐭渶鐩磋鐨勬弿榪版亹鎬曞簲璇ユ槸錛歵he class of
type銆傚敖綆¤繖鏍風殑鎻忚堪涓嶇畻鏈瀹屽錛屼絾涔熻凍浠ヨ鏄庨棶棰樸傛棭鍦?0騫翠唬錛屾硾鍨嬬殑姒傚康渚垮凡緇忓嚭鐜般傛渶鍒濅互“鍙傛暟鍖栫被鍨?#8221;鐨勫悕涔夊瓨鍦ㄣ?0騫翠唬鏈湡鍙戝睍璧鋒潵鐨?
鎭愰緳綰х殑Ada錛堟垜鐨勬剰鎬濅笉鏄Augusta Ada Byron Lovelace浼埖澶漢鏄亹榫欙紝浠庣敾鍍忎笂鐪嬶紝榪欎綅紼嬪簭鍛樼殑紲栧笀濂墮暱寰楃浉褰撴紓浜?)錛夛紝灝氭湭鎷ユ湁oop錛圓da83錛夛紝渚垮凡緇忓疄鐜頒簡娉涘瀷錛圙eneric)銆傚敖綆℃硾鍨嬪巻鍙叉偁涔咃紝浣嗙湡姝e叏闈㈠湴鍙戝睍璧鋒潵錛岃繕鏄湪90騫翠唬鍒濓紝
澶╂墠鐨?a title="Alexander a. stepanov" id="fx3k3">Alexander A. Stepanov鍒涘緩浜唖tl錛屼績浣夸簡“娉涘瀷緙栫▼”錛?a title="Generic programming" id="fx3k5">Generic Programming錛夌殑紜珛銆?br id="fx3k6"> 鍑轟簬綆渚跨殑鐩殑錛屾垜濂楃敤涓涓佹帀鐗欑殑“閫氱敤瀹瑰櫒”鏉ヨВ閲婃硾鍨嬬殑姒傚康銆傦紙灝辯畻鎴戞暦琛嶅惂:P錛屾瘯绔熼噸澶存垙鍦ㄥ悗闈紝鍏蜂綋鐨勮鐪嬪墠闈㈢粰鍑虹殑閾炬帴錛夈傚亣璁炬垜鍦ㄧ紪紼嬫椂闇瑕佷竴涓猧nt綾誨瀷鐨勬爤錛屼簬鏄垜鍋氫簡涓涓被瀹炵幇榪欎釜鏍堬細
class IntStack {...};
鐢ㄧ殑寰堝ソ銆傝繃浜嗕袱澶╋紝鎴戝張闇瑕佷竴涓爤錛屼絾鏄被鍨嬪彉鎴愪簡double銆備簬鏄紝鎴戝啀鍙﹀啓涓涓細
class DoubleStack {...};
涓嶅緱浜嗭紝濂借薄鏄氫簡椹渹紿濓紝涓嶆柇鍦板嚭鐜頒簡鍚勭綾誨瀷鐨勬爤鐨勯渶姹傦紝鏈塻tring鐨勶紝鏈塪atetime鐨勶紝鏈塸oint鐨勶紝鐢氳嚦榪樻湁涓涓狣ialog鐨勩傛瘡
縐嶇被鍨嬮兘寰楀啓涓涓被錛岃屼笖姣忔浠g爜鍑犱箮涓鏍鳳紝鍙槸鎵娑夊強鐨勭被鍨嬩笉鍚岃屽凡銆備簬鏄紝鎴戝氨鐑垏鍦版湡鏈涘嚭鐜頒竴縐嶄笢瑗匡紝瀹冨彧鏄竴涓唬鐮佺殑妗嗘灦錛屽疄鐜頒簡stack鐨勬墍
鏈夊姛鑳斤紝鍙槸鎶婄被鍨嬬┖鐫銆傜瓑鍝ぉ鎴戦渶瑕佷簡錛屾妸鏂扮殑綾誨瀷濉繘鍘伙紝渚垮緱鍒頒竴涓柊鐨剆tack綾匯?br id="fx3k11"> 榪欎究鏄硾鍨嬨?br id="fx3k12"> 浣嗘槸錛屼粎浠呰繖浜涳紝榪樹笉瓚充互鎴愬氨GP鐨勫▉鍚嶃?br id="fx3k13"> 鎴戞湁涓涓彜鎬殑闇姹傦紙鍛靛懙錛岀戶緇暦琛嶃?)錛夛細
鍋氫竴涓ā鏉匡紝鍐呴儴鏈変竴涓獀ector<>鎴愬憳錛?br id="fx3k15"> template<typename T> A
{
...
vector<T> m_x;
};
鍙槸錛屽鏋滅被鍨嬪疄鍙傛槸int綾誨瀷鐨勮瘽錛屽氨寰楃敤set<>銆備負浜嗕嬌鐢ㄧ殑鏂逛究錛屾ā鏉垮悕榪樺緱鏄疉銆備簬鏄紝鎴戜滑灝卞緱浣跨敤涓嬮潰鐨勬妧宸э細
template<> A<int>
{
...
set<T> m_x;
};
榪欏彨鐗瑰寲錛坰pecialization錛夛紝鐩稿綋浜庡憡璇夌紪璇戝櫒濡傛灉綾誨瀷瀹炲弬鏄痠nt錛岀敤鍚庨潰閭d釜銆傚惁鍒欙紝鐢ㄥ墠闈㈢殑銆傜壒鍖栧疄闄呬笂灝辨槸鏍規嵁綾誨瀷瀹炲弬鐢辯紪璇戝櫒鎵ц妯℃澘鐨勯夋嫨銆傛崲鍙ヨ瘽璇達紝鐗瑰寲鏄竴縐嶇紪璇戞湡鍒嗘淳鎶鏈?br id="fx3k27"> 榪欓噷榪樻湁鍙︿竴涓洿鍙ゆ渶姹傦細濡傛灉綾誨瀷瀹炲弬鏄寚閽堢殑璇濓紝灝辯敤list<>銆傝繖灝卞緱鐢ㄥ埌鍙︿竴縐嶇壒鍖栦簡錛?br id="fx3k28"> template<typename T> A<T*>
{
...
list<T> m_x;
}
榪欐槸灞閮ㄧ壒鍖栵紙partial specialization錛夛紝鑰屽墠闈㈢殑閭g鍙仛鏄懼紡鐗瑰寲錛坋xplicit specialization錛夛紝涔熷彨鍏ㄧ壒鍖栥傚眬閮ㄧ壒鍖栧垯鏄牴鎹被鍨嬪疄鍙傜殑鐗瑰緛錛堟垨鑰呭垎綾伙級鎵ц鐨勬ā鏉塊夋嫨銆?br id="fx3k34"> 鏈鍚庯紝榪樻湁涓涓渶鍙ゆ殑闇姹傦細濡傛灉綾誨瀷瀹炲弬鎷ユ湁褰㈠void func(int a)鎴愬憳鍑芥暟鐨勭被鍨嬶紝閭d箞灝變嬌鐢╠eque銆傝繖涓?..錛屾湁鐐歸毦銆傜幇鏈夌殑C++緙栬瘧鍣紝鏄棤娉曟弧瓚寵繖涓姹傜殑銆備笉榪囧笇鏈涜繕鏄湁鐨勶紝鍦ㄦ湭鏉ョ殑鏂扮増C++09涓紝鎴戜滑渚垮彲浠ヨВ鍐寵繖涓棶棰樸?br id="fx3k35">
Concept鍜岀被鍨?/h3>
concept鏄疓P鍙戝睍蹇呯劧緇撴灉銆傛濡傚墠闈㈡墍鎻愬埌鐨勯渶姹傦紝鎴戜滑鏈夋椂鍊欎細闇瑕佺紪璇戝櫒鑳藉閴磋瘑鍑虹被鍨嬬殑鏌愪簺鐗瑰緛錛屾瘮濡傛嫢鏈夌壒瀹氱殑鎴愬憳絳夌瓑錛岀劧鍚庢墽琛屾煇縐嶆搷浣溿備笅闈㈡槸涓涓渶甯哥敤鐨勪緥瀛愶細
swap()鏄竴涓潪甯告湁鐢ㄧ殑鍑芥暟妯℃澘錛屽畠鍙互浜ゆ崲涓や釜瀵硅薄鐨勫唴瀹癸紝榪欐槸swap鎵嬫硶鐨勫熀紜銆俿wap()鐨勫熀鏈畾涔夊樊涓嶅鏄繖鏍鳳細
template<typename T> swap(T& lhs, T& rhs) {
T tmp(lhs);
lhs=rhs;
rhs=tmp;
}
浣嗘槸錛屽鏋滈渶瑕佷氦鎹㈢殑瀵硅薄鏄鍣ㄤ箣綾葷殑澶у瀷瀵硅薄錛岄偅涔堣繖涓猻wap()鐨勬ц兘浼氬緢宸傚洜涓哄畠鎵ц浜嗕笁嬈″鍒訛紝榪欏線寰鏄疧(n)鐨勩傛爣鍑嗗鍣ㄩ兘鎻愪緵浜嗕竴涓?
swap鎴愬憳鍑芥暟錛岄氳繃浜ゆ崲瀹瑰櫒鍐呮寚鍚戞暟鎹紦鍐茬殑鎸囬拡錛岃幏寰桹(1)鐨勬ц兘銆傚洜姝わ紝swap()鎴愬憳鏄閫変嬌鐢ㄧ殑銆備絾鏄紝榪欏氨闇瑕佺▼搴忓憳璇嗗埆瀵硅薄鏄惁瀛樺湪
swap鎴愬憳錛岀劧鍚庡姞浠ヨ皟鐢ㄣ傚鏋渟wap()鍑芥暟鑳藉鑷姩璇嗗埆瀵硅薄鏄惁瀛樺湪swap鎴愬憳錛岄偅涔堝氨鍙互鏂逛究寰堝銆傚鏋滄湁swap鎴愬憳錛屽氨璋冪敤鎴愬憳錛屽惁鍒欙紝
灝辨槸鐢ㄤ笂榪伴氳繃涓棿鍙橀噺浜ゆ崲鐨勭増鏈?br id="fx3k46"> 榪欏氨闇瑕佺敤鍒癱oncept鎶鏈簡錛?br id="fx3k47"> template<Swappable T> void swap(T& lhs, T& rhs) {
lhs.swap(rhs);
}
榪欓噷錛孲wappable鏄竴涓猚oncept錛?br id="fx3k51"> concept Swappable<typename T> {
void T::swap(T&);
}
浜庢槸錛屽鏋滈亣鍒版嫢鏈塻wap鎴愬憳鍑芥暟鐨勫璞★紝姝eソ絎﹀悎Swappable concept錛岀紪璇戝櫒鍙互浣跨敤絎簩涓増鏈紝鍦∣(1)澶嶆潅搴﹀唴瀹屾垚浜ゆ崲銆傚惁鍒欙紝渚夸嬌鐢ㄥ墠涓涓増鏈細
vector a, b;
... //鍒濆鍖朼鍜宐
swap(a,b); //浣跨敤鍚庝竴涓増鏈?br id="fx3k58"> int c=10, d=23;
swap(c, d); //浣跨敤鍓嶄竴涓増鏈?br id="fx3k60"> 榪欓噷鐨剆wap()涔熸槸榪愮敤浜嗙壒鍖栵紝鎵涓嶅悓鐨勬槸鍦╟oncept鐨勬寚瀵間笅榪涜鐨勩傝繖鏍風殑鐗瑰寲鏈夋椂涔熻縐頒綔concept based overload銆?br id="fx3k61">
浠庝笂闈㈢殑渚嬪瓙涓彲浠ョ湅鍒幫紝鍘熷厛鐨勭壒鍖栵紝鏃犺鏄叏鐗瑰寲錛岃繕鏄眬閮ㄧ壒鍖栵紝瑕佷箞鐗瑰寲涓涓被鍨嬶紝瑕佷箞鐗瑰寲涓涓ぇ綾伙紙濡傛寚閽堬級鐨勭被鍨嬨備絾鏃犳硶鍋氬埌鏇村姞綺劇粏銆傛瘮濡傦紝鎴?
甯屾湜涓涓ā鏉胯兘澶熼拡瀵規墍鏈夌殑鏁存暟錛坕nt錛宭ong錛宻hort錛宑har絳夛級榪涜鐗瑰寲錛岃繖鍦ㄥ師鍏堟槸鏃犳硶鍋氬埌鐨勩備絾鎷ユ湁浜哻oncept涔嬪悗錛屾垜浠究鍙互
瀹氫箟涓涓唬琛ㄦ墍鏈夋暣鏁扮殑concept錛岀劧鍚庝嬌鐢ㄨ繖涓暣鏁癱oncept鎵ц鐗瑰寲銆傛崲鍙ヨ瘽璇達紝concept浣垮緱鐗瑰寲鏇村姞綺劇粏浜嗭紝鏁翠釜娉涘瀷緋葷粺浠庡師鏉?#8220;紱?
鏁?#8221;鐨勫彉鎴愪簡“榪炵畫”鐨勩?br id="fx3k62"> 涓嶈繃涓婇潰閭d釜concept鐗瑰寲鐨勬ā鏉跨湅璧鋒潵瀹炲湪涓嶇畻濂界湅錛屽ご涓婇偅涓鍧╰emplate...瀹炲湪鏈夌瑙傜灮銆傛棦鐒舵槸concept based overload錛岄偅涔堜綍涓嶇洿鎺ヤ嬌鐢ㄩ噸杞界殑褰㈠紡錛岃屼笉蹇呭啀甯︿笂绱禈鐨則emplate<...>錛?br id="fx3k66"> void fun(anytype a){...} //#1錛宎nytype鏄吉閫犵殑鍏抽敭瀛楋紝琛ㄧず鎵鏈夌被鍨嬨傝繖涓滆タ鏈濂藉皯鐢ㄣ?br id="fx3k67"> void fun(Integers a){...} //#2錛孖ntegers鏄痗oncept錛岃〃紺烘墍鏈夋暣鍨嬬被鍨?br id="fx3k68"> void fun(Floats a){...} //#3錛孎loats鏄痗oncept錛岃〃紺烘墍鏈夋誕鐐圭被鍨?br id="fx3k69"> void fun(long a){...} //#4
void fun(int a){...} //#5
void fun(double a){...} //#6
...
int x=1;
long y=10;
short z=7;
string s="aaa";
float t=23.4;
fun(x); //閫夋嫨#5
fun(y); //閫夋嫨#4
fun(z); //閫夋嫨#2
fun(s); //閫夋嫨#1
fun(t); //閫夋嫨#3
榪欑褰㈠紡鍦ㄨ涔変笂涓庡師鏉ョ殑妯℃澘褰㈠紡鍑犱箮涓鏍楓傛敞鎰忥紝鏄嚑涔庛傚涓嬬殑鎯呭艦鏄噸杞藉艦寮忔棤娉曞仛鍒扮殑錛?br id="fx3k84"> template<Integers T> T swap(T lhs, T rhs) {
T temp(lhs);
...
}
榪欓噷錛屾ā鏉垮仛鍒頒簡涓や歡浜嬶細鍏朵竴錛屾ā鏉胯悆鍙栧嚭綾誨瀷T錛屽湪鍑芥暟浣撲腑錛屽彲浠ヤ嬌鐢═鎵ц涓浜涙搷浣滐紝姣斿涓婅堪浠g爜涓殑涓存椂瀵硅薄temp鐨勬瀯閫犮傝繖涓棶棰樺鏄撹В鍐籌紝鍥犱負钀冨彇綾誨瀷T榪樻湁鍏朵粬鐨勬柟娉曪紝涓涓猼ypeof()鎿嶄綔絎︿究鍙疄鐜幫細
Integers swap(Integers lhs, Integers rhs) {
typeof(lhs) temp(lhs);
...
}
鍏朵簩錛屾ā鏉夸繚璇佷簡lhs錛宺hs鍜岃繑鍥炲奸兘鏄悓涓綾誨瀷銆傝繖涓棶棰橈紝鍙互閫氳繃鏂藉姞鍦ㄥ嚱鏁頒笂鐨刢oncept綰︽潫瑙e喅錛?br id="fx3k94"> Integers swap(Integers lhs, Integers rhs)
requires SameType<lhs, rhs>
&& SameType<lhs, retval> { //retval鏄潨鎾扮殑鍏抽敭瀛楋紝鐢ㄤ互琛ㄧず榪斿洖鍊?br id="fx3k97"> typeof(lhs) temp(lhs);
...
}
鐩告瘮涔嬩笅錛岄噸杞藉艦寮忔瘮杈冪箒鐞愩傛諱綋鑰岃█錛屽敖綆¢噸杞藉艦寮忓啑闀夸竴浜涳紝浣嗗惈涔夋洿鍔犳槑紜紝鏇村姞鐩磋銆傚茍涓斿湪concept鐨勬帴鍙e姛鑳戒綔鐢ㄤ笅錛屽鍙傛暟綾誨瀷涓鑷寸殑瑕佹眰
閫氬父騫朵笉澶氳錛堜竴鑸湪鍩烘湰綾誨瀷錛屽鏁村瀷絳夛紝鐨勮繍綆楀鐞嗕腑杈冨瑙併傚洜涓鴻繖浜涙搷浣滆姹傜被鍨嬫湁鐗瑰畾鐨勯暱搴︼紝浠ュ厤婧㈠嚭銆傚叾浠栫被鍨嬶紝鐗瑰埆鏄敤鎴峰畾涔夌被鍨嬶紝閫氬父鐢變簬灝?
瑁呯殑浣滅敤錛屼笉浼氬綾誨瀷鐨勫唴閮ㄧ壒鎬ф湁榪囧瑕佹眰錛屽惁鍒欏氨涓嶅簲浣跨敤娉涘瀷綆楁硶錛夈傚鏋滃彲浠ユ敼鍙樿娉曠殑璇濓紝閭d箞灝辮兘鐢ㄨ濡侤浠f浛typeof錛?=浠f浛
SameType鐨勬柟娉曞噺灝戜唬鐮侀噺錛?br id="fx3k101"> Integers swap(Integers lhs, Integers rhs)
requires @lhs == @rhs && @lhs == @retval {
@lhs temp(lhs);
...
}
Concept銆佺被鍨嬪拰瀵硅薄
浜嬫儏榪樺彲浠ユ湁鏇村姞澶稿紶鐨勫彂灞曘傚墠闈㈠娉涘瀷榪涜浜嗙壒鍖栵紝鑳戒笉鑳藉綾誨瀷涔熸潵涓鐣?#8220;鐗瑰寲”鍛紵褰撶劧鍙互錛?br id="z2t-"> void fun(int a);
void fun(int a:a==0); //瀵逛簬綾誨瀷int鑰岃█錛宎==0渚挎槸“鐗瑰寲”浜?br id="j1om"> 鏇村畬鏁寸殑錛屼篃鍙互鏈?#8220;灞閮ㄧ壒鍖?#8221;錛?br id="fx3k110"> void fun(int a); //#1
void fun(int a:a==0); //#2
void fun(int a:a>200); //#3
void fun(int a:a<20&&a>10); //#4
void fun(int a:(a>70&&a<90)||(a<-10)); //#5
...
int a=0, b=15, c=250, d=-50;
fun(80); //浣跨敤#5
fun(50); //浣跨敤#1
fun(a); //浣跨敤#2
fun(b); //浣跨敤#4
fun(c); //浣跨敤#3
fun(d); //浣跨敤#5
瀹為檯涓婏紝榪欐棤闈炴槸鍦ㄥ弬鏁板0鏄庝箣鍚庡姞涓婁竴緇勭害鏉熸潯浠訛紝鐢ㄤ互琛ㄦ槑璇ョ増鏈嚱鏁扮殑閫夋嫨鏉′歡銆傛病鏈夌害鏉熺殑鍑芥暟鐗堟湰鍦ㄦ病鏈変換浣曠害鏉熸潯浠跺尮閰嶇殑鎯呭喌涓嬭閫夋嫨銆傚浜庝嬌鐢ㄧ珛
鍗蟲暟鎴栬呴潤鎬佸璞$殑璋冪敤鑰岃█錛屽嚱鏁扮殑閫夋嫨鍦ㄧ紪璇戞湡鎵ц錛岀紪璇戝櫒鏍規嵁鏉′歡鐩存帴璋冪敤鍖歸厤鐨勭増鏈傚浜庡彉閲忎綔涓哄疄鍙傜殑璋冪敤鑰岃█錛屽垯闇瑕佸睍寮錛岀紪璇戝櫒灝嗚嚜鍔ㄧ敓鎴愬
涓嬩唬鐮侊細
//棣栧厛灝嗗嚱鏁伴噸鏂板懡鍚嶏紝璧嬩簣鍞竴鐨勫悕縐?br id="fx3k125"> void fun_1(int a); //#1
void fun_2(int a); //#2
void fun_3(int a); //#3
void fun_4(int a); //#4
void fun_5(int a); //#5
//鐒跺悗鏋勯犲垎媧懼嚱鏁?br id="fx3k131"> void fun_d(int a) {
if(a==0)
fun_2(a);
else if(a>200)
fun_3(a);
...
else
fun_1(a);
}
鍦ㄦ煇浜涙儏鍐典笅錛屽彲鑳介渶瑕佸涓涓璞$殑鎴愬憳鍋氬嚭綰︽潫錛屾鏃朵究鍙互閲囩敤榪欑褰㈠紡錛?br id="fx3k141"> struct A
{
float x;
};
...
void fun(A a:a.x>39.7);
...
榪欑鏂藉姞鍦ㄧ被鍨嬩笂鐨勬墍璋?#8220;鐗瑰寲”瀹為檯涓婂彧鏄竴縐嶈娉曠硸錛屽彧鏄敱緙栬瘧鍣ㄨ嚜鍔ㄧ敓鎴愪簡鍒嗘淳鍑芥暟鑰屽凡銆傝繖涓満鍒跺湪Haskell絳夎璦涓棭宸插瓨鍦紝騫朵笖鍦ㄤ嬌鐢ㄤ笂甯?
鏉ュ緢澶х殑鐏墊椿鎬с傚鏋滄病鏈夎繖縐嶆満鍒訛紝閭d箞涓鏃﹂渶瑕佸鍔犲嚱鏁板垎媧炬潯浠訛紝閭d箞蹇呴』鎵嬪伐淇敼鍒嗘淳鍑芥暟銆傚鏋滆繖浜涘嚱鏁幫紝鍖呮嫭鍒嗘淳鍑芥暟錛屾槸絎笁鏂規彁渚涚殑浠g爜錛岄偅涔堜慨
鏀瑰皢鏄緢楹葷儲鐨勪簨銆傝屼竴鏃︽嫢鏈変簡榪欑鏈哄埗錛岄偅涔堝彧闇娣誨姞涓涓浉搴旂殑鍑芥暟閲嶈澆鍗沖彲銆?br id="fx3k149"> 褰揷oncept-綾誨瀷閲嶈澆鍜岀被鍨?瀵硅薄閲嶈澆娣峰悎鍦ㄤ竴璧鋒椂錛屼究浣撶幇鏇村ぇ鐨勪綔鐢細
void fun(anytype a);
void fun(Integers a);
void fun(Floats a);
void fun(long a);
void fun(int a);
void fun(double a);
void fun(double a:a==0.8);
void fun(short a:a<10);
void fun(string a:a=="abc");
...
concept-綾誨瀷-瀵硅薄閲嶈澆浣撶郴閬靛驚涓涓師鍒欙細浼樺厛閫夋嫨鍖歸厤鐨勫嚱鏁頒腑鏈鐗瑰寲鐨勩傝繖瀹為檯涓婃槸綾誨瀷閲嶈澆瑙勫垯鐨勬墿灞曘傚ぇ鐨勬潵璇達紝鎵鏈夌被鍨嬫瘮鎵灞炵殑
concept鏇村姞鐗瑰寲錛屾墍鏈夊璞$害鏉熸瘮鎵灞炵殑綾誨瀷鏇村姞鐗瑰寲銆傚浜巆oncept鑰岃█錛屽鏋渃oncept A refine鑷猚oncept
B錛岄偅涔圓姣擝鏇村姞鐗瑰寲銆傚悓鏍鳳紝濡傛灉涓涓被鍨嬬殑綰︽潫寮轟簬鍙︿竴涓紝閭d箞鍓嶄竴涓氨姣斿悗涓涓洿鍔犵壒鍖栵紝姣斿a==20姣攁>10鏇村姞鐗瑰寲銆傜患鍚堣搗鏉ワ紝鍙互
鏈夎繖鏍蜂竴涓娊璞$殑瑙勫垯錛氫袱涓害鏉燂紙concept錛屾垨鑰呮柦鍔犲湪瀵硅薄涓婄殑綰︽潫錛堿鍜孊錛屼綔鐢ㄥ湪綾誨瀷鎴栬呭璞′笂鍒嗗埆浜х敓闆嗗悎錛屽鏋淎浜х敓鐨勯泦鍚堟槸B浜х敓鐨勯泦鍚?
鐨勭湡瀛愰泦錛岄偅涔堜究璁や負A姣擝鏇村姞鐗瑰寲銆?br id="fx3k161"> 鏍規嵁榪欎簺瑙勫垯錛屽疄闄呬笂鍙互瀵逛竴涓嚱鏁扮殑閲嶈澆鏋勯犲嚭涓涓?#8220;鐗瑰寲鏍?#8221;錛?br id="suy9">
綾繪ā鏉?/h3>
C++鐨勭被妯℃澘鐗瑰寲褰㈠紡騫朵笉鎯逛漢鍠滅埍錛?br id="fx3k166"> template<typename T> A{...}; //鍩虹妯℃澘
template<> A<int>{...}; //鏄懼紡鐗瑰寲錛堝叏鐗瑰寲錛?br id="fx3k168"> template<typename T> A<T*>{...}; //灞閮ㄧ壒鍖?br id="fx3k169"> 鍦–++09涓紝鍙互鐩存帴鐢╟oncept瀹氫箟妯℃澘鐨勭被鍨嬪艦鍙傦細
template<Integers T> A{...};
瀹炶川涓婏紝榪欑褰㈠紡鏈韓灝辨槸涓縐嶅眬閮ㄧ壒鍖栵紝鍥犺屽師鏈偅縐嶇瘡璧樺眬閮ㄧ壒鍖栧艦寮忓彲浠ュ簾闄わ紝浠d箣浠oncept椋庢牸鐨勫艦寮忥細
template<Pointer T> A{...}; //Pointer琛ㄧず姝ゅ閲囩敤鎸囬拡鐗瑰寲妯℃澘
鍚屾牱錛屽鏋滄帹騫垮埌鍏ㄧ壒鍖栵紝褰㈠紡涔熷氨榪涗竴姝ョ畝鍗曚簡錛?br id="fx3k174"> template<int> A{...}; //榪欎釜褰㈠紡鏈変簺紿佸厐錛岃繖閲屽彧鎵撶畻琛ㄨ揪榪欎釜鎰忔濓紝搴旇鏈夋洿“鍜岃皭”鐨勫艦寮?br id="fx3k175"> 濡傛灉妯℃澘鍙傛暟鏄璞★紝鍒欎嬌鐢ㄧ幇鏈夌殑瀹氫箟褰㈠紡錛?br id="fx3k176"> template<int a> A{...};
鏇磋繘涓姝ワ紝鍙互寮曞叆瀵硅薄鐨勭害鏉燂細
template<int a:a>10> A{...};
姝ゅ錛孋++涓湪妯℃澘鐗瑰寲涔嬪墠闇瑕佹湁鍩虹妯℃澘銆備絾瀹為檯涓婅繖鏄浣欑殑錛孌璇█宸茬粡鍙栨秷浜嗚繖涓檺鍒訛紝榪欏浜庣畝鍖栨ā鏉跨殑浣跨敤鏈夌潃鑾ぇ鐨勫府鍔┿?br id="fx3k180">
浠庢湰璐ㄤ笂璁?..
浠庢湰璐ㄤ笂璁詫紝鎴戜滑鍙互鎶婃墍鏈夌被鍨嬬湅浣滀竴涓泦鍚圱={ti}錛岃宑oncept鍒欐槸鏂藉姞鍦ㄧ被鍨嬮泦鍚堜笂鐨勭害鏉熴傞氳繃concept榪欎釜綰︽潫錛屾垜浠究鍙互鑾峰緱綾?
鍨嬮泦鍚圱鐨勪竴涓瓙闆咰銆傜悊璁轟笂錛屾墍鏈塩oncept鎵瀵瑰簲鐨勭被鍨嬪瓙闆咰j鏋勬垚浜嗙被鍨嬮泦鍚堢殑騫傞泦{Cj}銆傚湪{Cj}涓紝鏈変袱綾葷被鍨嬪瓙闆嗘槸寰堢壒孌婄殑銆備竴緇勬槸
T鏈?
韜紝鍗蟲墍鏈夌被鍨嬨傚瓨鍦ㄤ竴涓猚oncept涓嶅T鏂藉姞浠諱綍綰︽潫錛屼究寰楀埌浜咰0=T銆傜浜岀被鍒欐槸鍙︿竴涓瀬绔紝瀛樺湪涓緇刢oncept錛屾柦鍔犲湪T涓婁箣鍚庢墍寰楃殑綾?
鍨嬪瓙闆嗕粎鍖呭惈涓涓被鍨嬶細Ci={ti}銆傜敱浜庤繖緇刢oncept涓庣被鍨嬪瓨鍦ㄤ竴涓瀵瑰簲鐨勫叧緋伙紝閭d箞鎴戜滑渚垮彲浠ョ敤榪欑粍concept鏉ユ寚浠g被鍨嬨備篃灝辨槸鎶婄被鍨?
浣滀負鐗規畩鐨刢oncept澶勭悊銆傚姝わ紝concept渚垮悓綾誨瀷緇熶竴鍦ㄤ竴涓綋緋諱腑銆傝繖縐嶅鐞嗗彲浠ヤ嬌鎴戜滑鑾峰緱鏋佸ぇ鐨勫ソ澶勩?br id="fx3k63">
榪欑粍鐗規畩鐨刢oncept浠嶆棫浣跨敤瀵瑰簲鐨勭被鍨嬪悕浣滀負縐拌皳錛屼粛鏃хО涔嬩負“綾誨瀷”錛屼絾鍏舵湰璐ㄤ笂榪樻槸concept銆備換浣曚竴涓被鍨嬶紝涓鏃﹀垱寤猴紝涔熷氨鍒涘緩浜嗙浉搴旂殑鐗規畩concept銆傚鏋滃湪妯℃澘鐗瑰寲涓嬌鐢ㄤ竴涓被鍨嬬殑鏃跺欙紝瀹為檯涓婂氨鏄湪浣跨敤鐩稿搴旂殑閭d釜鐗規畩concept錛?br id="fx3k64">
void func(typeA a); //灝界浣跨敤浜嗙被鍨嬪悕typeA錛屼絾瀹為檯涓婅繖閲屾墍鎸囩殑鏄痶ypeA鎵瀵瑰簲鐨勯偅涓壒孌奵oncept銆?br id="fx3k65">
鍦ㄨ繖涓猚oncept浣撶郴鐨勪綔鐢ㄤ笅錛屽嚱鏁版ā鏉跨殑鐗瑰寲鍜岄噸杞芥暣涓湴緇熶竴璧鋒潵錛坈oncept based overload錛夈?br id="s8-t"> 鑷充簬浣滅敤鍦ㄧ被鍨嬩笂鐨勯偅縐?#8220;鐗瑰寲”錛屼篃鏄悓鏍風殑閬撶悊銆傚浜庝竴涓被鍨婽鑰岃█錛屽畠鎵鏈夌殑瀵硅薄鏋勬垚涓涓泦鍚圤銆傚鏋滃瓨鍦ㄤ竴緇勭害鏉熶綔鐢ㄤ簬O錛岄偅涔堟瘡
涓涓害鏉熷搴旂潃O鐨勪竴涓瓙闆嗐傜悊璁轟笂錛屾垜浠彲浠ユ瀯閫犲嚭涓緇勭害鏉燂紝浣垮緱浠栦滑鍚孫鐨勬瘡涓涓瓙闆嗕竴涓瀵瑰簲銆傚悓鏍鳳紝榪欎簺瀛愰泦涓湁涓ょ被瀛愰泦姣旇緝鐗規畩銆備竴綾繪槸鎵鏈夊璞?
鐨勯泦鍚堛傚彟涓綾諱究鏄彧鏈変竴涓璞$殑瀛愰泦銆備簬鏄紝鎴戜滑鍙互浣跨敤榪欑粍鐗規畩瀵硅薄瀛愰泦鎵瀵瑰簲鐨勭害鏉熸寚浠g浉搴旂殑瀵硅薄銆備篃灝辨槸灝嗗璞$湅浣滅壒孌婄殑綰︽潫銆傚姝わ紝綾誨瀷鍜屽璞?
涔熻緇熶竴鍦ㄤ竴涓郴緇熶腑浜嗐?br id="hh4e"> 榪涜岋紝綾誨瀷鍦ㄩ昏緫涓婅浣滀負鐗規畩concept澶勭悊錛屽璞″垯琚綔涓虹壒孌婄殑綾誨瀷澶勭悊銆備簬鏄紝榪欎笁鑰呬究鍙互緇熶竴鍦ㄤ竴涓綋緋諱笅錛屼竴鍚屽弬涓庣壒鍖栥?br id="fx3k181">
鎬葷粨
灝界褰㈠紡涓嶈兘浠h〃鏈川錛屼絾褰㈠紡鐨勫彉鍖栧線寰浼氬甫鏉ュ緢澶氭湁鐩婄殑榪涙銆傛洿閲嶈鐨勬槸錛屽緢澶氭湰璐ㄤ笂鐨勫彉鍖栨諱細浼撮殢鐫褰㈠紡涓婄殑鏀瑰彉銆傞氳繃灝哻oncept銆佺被鍨嬪拰瀵硅薄
鍦ㄩ昏緫涓婃暣鍚堝埌緇熶竴鐨勪綋緋諱箣涓紝渚垮彲浠ヤ績浣挎ā鏉褲佺壒鍖栥佸嚱鏁伴噸杞界瓑鏈哄埗鍦ㄥ艦寮忎笂杈炬垚緇熶竴銆備粠鑰岃兘澶熺畝鍖栬繖浜涘姛鑳界殑浣跨敤銆傝繖涔熸槸褰撳墠閲嶈璇█錛堝伐鍏鳳級鏄撶敤鎬?
鐨勬疆嫻佺殑涓涓繀鐒惰瘔姹傘傝繖涓艦寮忎笂鐨勭粺涓騫墮潪璇硶緋栦箣綾葷殑琛ㄩ潰鍙樺寲銆傝屾槸瀹屽叏渚濊禆浜巆oncept榪欎釜鏂板瀷鐨勭被鍨嬫弿榪幫紙娉涘瀷錛夌郴緇熺殑紜珛鍜屽彂灞曘?
concept鐨勫嚭鐜幫紝寮ヨˉ浜嗕互寰娉涘瀷鐨勪笉瓚籌紝鎵懼洖浜嗘硾鍨嬬郴緇熺己澶辯殑鐜妭錛屽譏琛ヤ簡娉涘瀷鍚岀被鍨嬩箣闂寸殑瑁傜棔銆傚湪姝や綔鐢ㄤ笅錛屼究鍙互鏋勫緩璧穋oncept-綾誨瀷-
瀵硅薄鐨勬娊璞′綋緋伙紝鐢ㄧ粺涓鐨勭郴緇熷泭鎷繖涓変釜鍘熸湰鍒嗙珛鐨勬蹇點傚湪榪欎釜鏂扮殑涓変綅涓浣撶殑緋葷粺涓嬶紝浣垮緱妯℃澘鐨勭壒鍖栧拰閲嶈澆鎷ユ湁浜嗙浉鍚岀殑褰㈠紡錛岃繘鑰岃幏寰楁洿鐩磋鐨勮涔夛紝鍜?
鏇村ソ鐨勬槗鐢ㄦс?img src ="http://www.shnenglu.com/longshanks/aggbug/57246.html" width = "1" height = "1" />
娉細涓ユ牸鍦拌錛岀摝鏍肩撼鐨勮繖浜涗綔鍝佸茍涓嶆槸姝屽墽錛屾湁涓涓寮忕殑鍚嶇О錛歮usic drama錛岀洿鎺ョ炕璇戞槸“闊充箰鎴忓墽”錛屾槸姝屽墽鐨勬墿灞曘備絾鏄負浜嗘柟渚匡紝榪樻槸騫夸箟涓婂湴灝嗗叾縐頒綔姝屽墽銆?br>
#define procedure void
#define begin {
#define end }
鐒跺悗錛?br> procedure fun(int x)
begin
...
end
瀹為檯涓婏紝瀹冪殑鎰忔濇槸錛?br> void fun(int x)
{
...
}
榪欏彲浠ョ湅浣滄槸瀵瑰垵瀛璇█鐨凱ascal紼嬪簭鍛樼殑瀹夋叞銆傝繖縐嶈供鑴氱殑鎴忔硶鍙互綆椾綔鍏冪紪紼嬬殑涓縐嶏紝鍦ㄤ竴縐嶈璦閲屽垱閫犱簡鍙︿竴涓娉曘備笉榪囷紝瀹炲湪鏈変簺鏃犺亰銆傜劧鑰岋紝鍦ㄥ疄闄呭紑鍙戜腑錛屾垜浠垨澶氭垨灝戝湴浼氶渶瑕佷竴浜涜秴鍑鴻娉曡寖鍥寸殑鏈哄埗銆傛湁鏃朵負浜嗗畬鍠勮璦錛屽譏琛ヤ竴浜涚己鎲撅紱鏈夋椂涓轟簡澧炲己涓浜涘姛鑳斤紱鏈夋椂涓轟簡鑾峰緱涓浜涙柟渚褲傛洿鏂版疆鐨勶紝鏄瘯鍥懼湪涓縐岹PL閲屾瀯寤篋omain Specific Language錛屾垨鑰呰“瀛愯璦”錛屼互鑾峰緱鏌愪釜鐗規ч鍩熶笂鏇寸洿瑙傘佹洿綆媧佺殑緙栫▼鏂瑰紡銆傝繖浜涘璇█鐨勬墿灞曢渶姹傜殑瀹炵幇錛屼緷璧栦簬琚О涓篗eta- Programming錛圡P錛夌殑鎶鏈?br> 鍙︿竴鏂歸潰錛岄殢鐫璇█鍔熻兘鍜岀壒鎬х殑涓嶆柇澧炲姞錛岃秺鏉ヨ秺澶氱殑浜哄紑濮嬫姳鎬ㄨ璦澶鏉傘備竴鏂歸潰錛?#8220;闅鵑亾鎴戜滑浼氶渶瑕侀偅浜涗竴杈堝瓙涔熺敤涓嶅埌鍑犲洖鐨勮璦鏈哄埗錛屾潵澧炲姞璇█鐨勫鏉傛у拰瀛︿範浣跨敤鑰呯殑璐熸媴鍚楋紵”銆傚彟涓鏂歸潰錛?#8220;鏈夊鏃犳偅錛屼竴涓璦鏈哄埗瑕佸埌榪湪鐪夌潾鐨勬椂鍊欐墠鍘昏冭檻鍚楋紵”銆備絾MP鎶鏈垯灝嗚繖瀵圭煕鐩炬秷寮簬鏃犲艦銆備竴縐嶈璦錛屽彲浠ョ畝媧佸埌鍙渶鏈鍩烘湰鐨勪竴浜涚壒鎬с傝屽叾浠栫壒瀹氱殑璇█鍔熻兘闇姹傦紝鍙互閫氳繃MP鍔犱互鎵╁睍銆傚鏋滀笉闇瑕佹煇縐嶇壒鎬э紝閭d箞鍙涓嶅姞杞界浉搴旂殑MP浠g爜鍗沖彲錛岃屾棤闇涓洪偅浜涙満鍒惰岀儲鎭箋?br> MP鏈璇變漢鐨勫湴鏂癸紝鑾繃浜庢垜浠彲浠ラ氳繃緙栧啓涓涓唬鐮佸簱渚夸嬌寰楄璦鍏峰浠ュ線娌℃湁鐨勭壒鎬с?br> 鐒惰岋紝鍏ㄩ潰鐨凪P鑳藉姏寰寰甯︽潵宸ㄥぇ鐨勫壇浣滅敤錛屼互鑷充簬鎴戜滑鏃犳硶鐭ラ亾鍒板簳鏄ソ澶勬洿澶氾紝榪樻槸鍓綔鐢ㄦ洿澶氥傝璦鐨勯殢鎰忔墿灞曞線寰甯︽潵鏌愪簺鍗遍櫓錛屾瘮濡傝娉曠殑鍐茬獊鍜屼笉鍏煎錛屽鍩虹璇█鐨勫共鎵幫紝鍏抽敭瀛楃殑娉涙互絳夌瓑銆傛崲鍙ヨ瘽璇達紝MP鏄瓩鎮熺┖錛屾湰棰嗛珮寮恒備絾娌℃湁绱х畭鍜掞紝鏄涓嶄綇浠栫殑銆?br> 閭d箞錛岀揣綆嶅拻鏄粈涔堝憿錛熻繖灝辨槸榪欓噷鎵撶畻鎺㈣鐨勪富棰樸傛湰鏂囨墦綆楅氳繃瑙傚療涓ょ宸插瓨鍦ㄧ殑MP鎶鏈紝鍒嗘瀽瀹冧滑鐨勭壒鐐逛笌緙洪櫡錛屼粠涓壘鍑鴻В鍐抽棶棰樼殑錛堝彲鑳斤級閫斿緞銆? AST瀹?/h4>
syntax(x, "<->", y, ";")
{
std::swap(x, y);
}
褰撻亣鍒頒唬鐮侊細
x <-> y;
鐨勬椂鍊欙紝緙栬瘧鍣ㄧ敤std::swap(x,y);鍔犱互鏇挎崲銆傚疄闄呬笂錛岃繖鏄皢涓縐嶈娉曠粨鏋勬槧灝勫埌鍙︿竴涓娉曠粨鏋勪笂銆傝宎st瀹忓垯鏄繖縐嶆槧灝勭殑鎵ц鑰呫?br> 浣嗘槸錛宎st瀹忓茍鏈秷闄ゅ畯鏈韓鐨勯偅浜涚己闄楓傚鏋渪鎴栬厃鏈韓涓嶇鍚坰wap鐨勮姹傦紙綾誨瀷鐩稿悓錛屽茍涓旇兘澶嶅埗鏋勯犲拰璧嬪鹼紝鎴栬呮嫢鏈塻wap鎴愬憳鍑芥暟錛夛紝閭d箞 ast瀹忚皟鐢ㄧ殑鏃跺欐棤娉曞姝や綔鍑烘楠屻傚畯閫氬父浠ラ緙栬瘧鍣ㄥ鐞嗭紝ast瀹忓垯灝嗗叾鎺ㄨ繜鍒拌娉曞垎鏋愪箣鏃躲備絾鏄鏃朵緷鐒舵棤娉曞緱鍒皒鎴杫鐨勮涔夌壒寰侊紝鏃犳硶鐩存帴鍦ㄨ皟鐢ㄧ偣緇欏嚭閿欒淇℃伅銆?br> 鍚屾椂錛宎st瀹忚繕鏄棤娉曞鐞嗕簩涔夋х殑璇硶鏋勯犮傚鏋滀竴涓猘st瀹忔墍瀹氫箟鐨勮娉曟瀯閫犱笌涓昏璦錛屾垨鑰呭叾浠朼st瀹忕殑鐩稿悓錛屽垯浼氬紩鍙戞販涔便備絾鏄紝濡傛灉綆鍗曠矖鏆村湴灝嗚繖縐?#8220;閲嶅畾涔?#8221;浣滀負闈炴硶澶勭悊錛岄偅涔堜細澶уぇ緙╁皬ast瀹忥紙浠ュ強MP錛夌殑搴旂敤鑼冨洿銆傚疄闄呬笂錛岃繖縐嶈娉曟瀯閫犵殑閲嶅畾涔夋湁鍏剁幇瀹炴剰涔夛紝鍙互鐪嬩綔涓縐嶈娉曟瀯閫犵殑“閲嶈澆”錛屾垨鑰呭嚱鏁幫紙鎿嶄綔絎︼級閲嶈澆鐨勪竴縐嶆墿灞曘?br> 瑙e喅鐨勬柟娉曞茍涓嶅鏉傦紝灝辨槸涓篴st瀹忓姞涓婄害鏉?/strong>銆傚疄闄呬笂錛岀被浼肩殑鎯呭艦鍦–++98鐨勬ā鏉夸笂涔熷瓨鍦紝鑰孋++鍒欒瘯鍥鵑氳繃涓烘ā鏉挎坊鍔燾oncept綰︽潫鍔犱互瑙e喅銆傝繖縐嶇害鏉熸湁涓や釜浣滅敤錛氬叾涓錛屽湪絎竴鏃墮棿瀵筧st瀹忕殑浣跨敤榪涜姝g‘鎬ф楠岋紝鑰屾棤闇絳夊埌浠g爜灞曞紑涔嬪悗錛涘叾浜岋紝鐢ㄤ互鍖哄垎鍚屼竴涓娉曟瀯閫犵殑涓嶅悓鐗堟湰銆?br> 浜庢槸錛屽浜庝笂榪頒緥瀛愬彲浠ヨ繖鏍鋒柦鍔犵害鏉燂紙榪欎簺浠g爜鍙兘琛ㄨ揪涓涓剰鎬濓紝榪樻棤娉曠湅浣滅湡姝f剰涔変笂鐨凪P璇硶錛夛細
syntax(x, "<->", y, ";")
where x,y is object of concept (has_swap_mem or (CopyConstructable and Assignable))
&& typeof(x)==typeof(y)
{
std::swap(x,y);
}
濡傛錛岄櫎闈瀤錛寉閮芥槸瀵硅薄錛屽茍涓旂鍚堟墍鎸囧畾鐨刢oncept錛屽惁鍒欑紪璇戝櫒浼氬綋鍗沖姞浠ユ嫆緇濓紝鑰屼笖鐩存埅浜嗗綋銆?br> 涓嶈繃錛屽姝ゅ彉鍖栦箣鍚庯紝ast瀹忓皢涓嶄細鍐嶆槸瀹忎簡銆傚洜涓鴻繖縐嶇害鏉熸槸璇箟涓婄殑錛屽繀欏葷瓑鍒拌涔夊垎鏋愰樁孌碉紝鏂硅兘媯楠屻傝繖灝辮秴鍑轟簡瀹忕殑棰嗗湴浜嗐備笉榪囨棦鐒禷st瀹忓彲浠ヤ粠棰勫鐞嗛樁孌墊帹榪熷埌璇硶鍒嗘瀽闃舵錛岄偅涔堝啀鎺ㄨ繜涓涓嬩篃娌″叧緋匯傚啀璇達紝鎴戜滑鍏蟲敞鐨勬槸榪欑鍔熻兘錛屽甫綰︽潫鐨刟st瀹忓埌搴曟槸涓嶆槸瀹忥紝涔熸棤鍏崇揣瑕併?/p>
TMP
group = '(' >> expr >> ')'; expr = expr2 >> *(('+' >> expr2) | ('-' >> expr2));
syntax synSwap=x "<->" y ";"
require SameType<decltype(x), T> && SameType<decltype(y), T>
&& (has_swap_mem<T> || (CopyConstructable<T> and Assignable<T>)
{
std::swap(x, y);
}鐢ㄦ埛瀹氫箟鐨勮娉?/strong>
鎬葷粨
GP鎶鏈殑灞曟湜鈥斺旈亾鐢熶竴錛屼竴鐢熶簩
by 鑾崕鏋?span style="font-size: 8pt;">
榪愯鏃跺鎬?/h3>
鐜板湪鐨勫簲鐢ㄤ晶閲嶄簬浜や簰寮忕殑榪愪綔褰㈠紡錛岃姹傝蔣浠跺湪鐢ㄦ埛杈撳叆涓嬩綔鍑哄搷搴斻備負浜嗗湪榪欑鎯呭喌涓嬶紝杞歡鐨勬暣浣撶粨鏋勭殑浼樺寲錛屽ぇ閲忎嬌鐢ㄧ粍浠舵妧鏈紝浣垮緱杞歡鎴愪負“鍙粍瑁?#8221; 鐨勭郴緇熴傝屾帴鍙?瀹炵幇鍒嗙鐨勭粨鏋勫艦寮忓緢濂藉湴瀹炵幇浜嗚繖涓洰鏍囥傚鎬佸湪姝や腑璧峰埌浜嗗叧閿х殑浣滅敤銆傚叾涓紝浠OP涓轟唬琛ㄧ殑“鍔ㄥ鎬?#8221;錛堜篃縐頒負 “subtyping澶氭?#8221;錛夛紝鏋勫緩璧峰湪榪愯鏃跺彲璋冩帶鐨勫彲緇勮緋葷粺銆侴P浣滀負“闈欏鎬?#8221;錛岃繍鐢ㄦ硾鍖栫殑綾誨瀷浣撶郴錛屽ぇ澶х畝鍖栬繖縐嶇郴緇熺殑鏋勫緩錛屾秷闄ら噸澶嶅姵鍔ㄣ傚彟澶栬繕鏈変竴縐嶉矞涓轟漢鐭ョ殑澶氭佸艦寮忥紝琚奀++ Template銆嬬殑浣滆匘avid Vandevoorde鍜孨icolai M. Josuttis縐頒負runtime unbound澶氭併傝屽師鏉ョ殑“鍔ㄥ鎬?#8221;錛屽嵆OOP澶氭侊紝琚粏鍖栦負runtime bound澶氭侊紱“闈欏鎬?#8221;錛屼篃灝辨槸妯℃澘錛屽垯琚О涓簊tatic unbound澶氭併?br> 涓嶈繃榪欑縐拌皳瀹規槗寮曡搗璇В錛屼富瑕佸氨鏄痷nbound榪欎釜璇嶄笂銆傚湪榪欓噷unbound鍜宐ound鏄寚鍦ㄧ紪鍐欎唬鐮佹椂錛屼竴涓猻ymbol鏄惁鍚屼竴涓叿浣撶殑綾誨瀷 bound銆備粠榪欑偣鏉ョ湅錛岀敱浜嶨P浠g爜鍦ㄧ紪鍐欎箣鏃訛紝闈㈠悜鐨勬槸娉涘瀷錛屼笉鏄叿浣撶殑綾誨瀷錛岄偅涔圙P鏄痷nbound鐨勩傚洜涓虹幇鏈夌殑GP鏄紪璇戞湡鐨勬妧鏈紝鎵浠ユ槸 static鐨勩侽OP鐨勫姩澶氭佸垯蹇呴』閽堝涓涓叿浣撶殑綾誨瀷緙栧啓浠g爜錛屾墍浠ユ槸bound鐨勩備絾鍥犱負鍔ㄥ鎬佸彲浠ュ湪榪愯鏃剁‘瀹氱湡姝g殑綾誨瀷錛屾墍浠ユ槸runtime 鐨勩傝嚦浜巖untime unbound錛屼互寰鍙嚭鐜板湪鍔ㄦ佽璦涓紝姣斿SmallTalk銆丳ython銆丷uby錛屼竴縐嶅艦璞″湴縐拌皳鏄?#8220;duck-typing”澶氭併傚叧浜庡鎬佺殑鏇村畬鏁寸殑鍒嗙被鍜屼粙緇嶅彲浠ョ湅榪欓噷銆?br> 閫氳繃鍔ㄦ佽璦鏈哄埗瀹炵幇鐨剅untime unbound錛屽瓨鍦ㄧ殑鎬ц兘鍜岀被鍨嬪畨鍏ㄩ棶棰樸備絾褰撴垜浠皢GP涓殑concept鎶鏈帹騫垮埌runtime鏃朵細鍙戠幇錛宺ungime unbound鍙互鎷ユ湁鍚孫OP鍔ㄥ鎬佺浉褰撶殑鏁堢巼鍜岀被鍨嬪畨鍏ㄦэ紝浣嗗嵈鍏鋒湁鏇村ぇ鐨勭伒媧繪у拰鏇翠赴瀵岀殑鐗規с傚叧浜庤繖鏂歸潰錛屾垜宸茬粡鍐欒繃涓綃?a >鏂囩珷 錛屽ぇ鑷存弿榪頒簡涓縐嶅疄鐜皉untime concept鐨勯斿緞錛堟湰鏂囩殑闄勫綍閲岋紝鎴戜篃緇欏嚭浜嗚繖縐峳untime concept瀹炵幇鐨勬敼榪涳級銆?
Runtime Concept
Runtime concept鐨勫疄鐜板茍涓嶄細寰堝鏉傦紝鍩烘湰涓婂彲浠ユ部鐢∣OP涓殑“铏氳〃”鎶鏈紝騫朵笖鍙互鏇村姞綆鍗曘傜湡姝e鏉傜殑閮ㄥ垎鏄浣曞湪璇█灞傞潰琛ㄨ揪鍑鴻繖縐峳untime GP錛岃屼笉瀵瑰凡鏈夌殑static GP鍜屽叾浠栬璦鐗規ч犳垚騫叉壈銆傚湪榪欓噷錛屾垜棣栧厛寤虹珛涓涓熀鏈殑鏂規錛岀劧鍚庨氳繃涓浜涙渚嬪鍏惰繘琛屾楠岋紝鍦ㄥ彂鐜伴棶棰樺悗鍐嶅仛璋冩暣銆?br> 鑰冭檻鍒皉untime concept鏈韓涔熸槸concept錛岄偅涔堟部鐢╯tatic concept鐨勫畾涔夊艦寮忔槸涓嶄細鏈夐棶棰樼殑錛?br> concept myconcept<T> {
T& copy(T& lhs, T const& rhs);
void T::fun();
...
}
鍏蜂綋鐨刢oncept瀹氫箟鍜屼嬌鐢ㄨ鍒欙紝鍙互鍙傝僀++0x鐨?a >concept鎻愭鎴?a >榪欑瘒鏂囩珷 錛屼互鍙?a >榪欑瘒鏂囩珷 銆?br> 鍙︿竴鏂歸潰錛屾垜浠彲浠ラ氳繃concept_map灝嗙鍚堜竴涓猚oncept鐨勭被鍨嬬粦瀹氬埌璇oncept涔嬩笂錛?br> concept_map myconcept<MyType> {}
鐩稿叧鍐呭涔熷彲鍙傝冧笂榪版枃浠躲?br> 鏈変簡concept涔嬪悗錛屾垜浠究鍙互鐢ㄥ畠浠害鏉熶竴涓ā鏉匡細
template<myconcept T>void myfun(T const& val); //鍑芥暟妯℃澘
template<myconcept T>class X //綾繪ā鏉?br> {
...
};
鍒版涓烘錛宺untime concept鍚宻tatic concept榪樻槸鍚屼竴涓簨鐗┿傚畠浠湡姝g殑鍒嗙鍦ㄤ簬浣跨敤銆傚浜巗tatic concept搴旂敤錛屾垜浠嬌鐢ㄤ竴涓叿浣撶殑綾誨瀷鍦ㄥ疄渚嬪寲錛堢壒鍖栵級涓涓ā鏉匡細
X<MyType> x1; //瀹炰緥鍖栦竴涓被妯℃澘
MyType obj1;
myfun(obj1); //緙栬瘧鍣ㄦ帹瀵紀bj1瀵硅薄鐨勭被鍨嬪疄渚嬪寲鍑芥暟妯℃澘
myfun<MyType>(obj1); //鍑芥暟妯℃澘鐨勬樉寮忓疄渚嬪寲
鐜板湪錛屾垜浠皢鍏佽涓縐嶉潪甯歌鐨勫仛娉曪紝浠ヤ嬌runtime concept鎴愪負鍙兘錛?strong>鍏佽浣跨敤concept瀹炰緥鍖栦竴涓ā鏉匡紝鎴栧畾涔変竴涓璞?/strong>銆?br> X<myconcept> x2;
myconcept* obj2=new myconcept<MyType>;
myfun(obj2); //姝ゅ錛岀紪璇戝櫒灝嗕細鐢熸垚runtime鐗堟湰鐨刴yfun
榪欓噷鐨勫惈涔夐潪甯告槑紜細瀵逛簬x2錛屾帴鍙椾換浣曠鍚坢yconcept鐨勭被鍨嬬殑瀵硅薄銆俹bj2鏄竴涓?#8220;鍔ㄦ佸璞?/strong>”錛堣繖閲屽皢runtime concept寮曞叆鐨勯偅縐嶄笉鐭ラ亾鐪熷疄綾誨瀷錛屼絾絎﹀悎鏌愪釜concept鐨勫璞$О涓?#8220;鍔ㄦ佸璞?#8221;銆傝岀被鍨嬫槑紜凡鐭ョ殑瀵硅薄鎴愪負“闈欐佸璞?#8221;錛夛紝絎﹀悎myconcept瑕佹眰銆傝嚦浜庡疄闄呯殑綾誨瀷錛岄殢渚匡紝鍙絎﹀悎myconcept灝辮銆?br> 榪欑鎯呭艦闈炲父綾諱技浜庝紶緇熷姩澶氭佺殑interface銆備絾鏄紝瀹冧滑鏈夌潃鏍規湰鐨勫樊寮傘俰nterface鏄竴涓叿浣撶殑綾誨瀷錛屽茍涓旇姹傜被鍨嬮氳繃緇ф壙榪欑褰㈠紡瀹炵幇榪欎釜鎺ュ彛銆傝宑oncept鍒欎笉鏄竴縐嶇被鍨嬶紝鑰屾槸涓縐?#8220;娉涘瀷”鈥斺斿叿澶囨煇縐嶇壒寰佺殑綾誨瀷鐨勬娊璞★紙鎴栭泦鍚堬級錛屼笉闇瑕佸湪綾誨瀷鍒涘緩鏃剁珛鍒諱笌鎺ュ彛緇戝畾銆備笌 concept鐨勭粦瀹氾紙concept_map錛夊彲浠ュ彂鐢熷湪浠諱綍鏃跺欍備簬鏄紝runtime concept瀹為檯涓婃垚涓轟簡涓縐?strong>闈炰鏡鍏ョ殑鎺ュ彛銆傜浉姣攊nterface榪欑渚靛叆鍨嬬殑鎺ュ彛錛屾洿鍔犵伒媧諱究鎹楓?br> 閫氳繃榪欐牱涓縐嶅仛娉曪紝鎴戜滑渚垮彲浠ヨ幏寰椾竴縐嶈兘澶熷湪榪愯鏃跺伐浣滅殑GP緋葷粺銆?br> 鍦ㄦ鍩虹涓婏紝涓轟簡渚夸簬鍚庣畫妗堜緥灞曞紑錛岃繘涓姝ュ紩鍏ヤ竴浜涙湁鐢ㄧ殑鐗規э細
涓嬮潰錛屽氨寮濮嬬涓涓渚嬨?
妗堜緥錛氬崌綰х殑鍧﹀厠
鍋囪鎴戜滑鍋氫竴涓父鎴忥紝涓婚鏄紑鍧﹀厠鎵撲粭銆傛寜娓告垙鐨勬儻渚嬶紝娑堢伃鏁屼漢鍙互寰楀埌縐垎錛岀Н鍒嗗埌涓瀹氭暟閲忥紝渚垮彲浠ュ崌綰с備負浜嗙畝渚胯搗瑙侊紝鎴戜滑鍙冭檻瀵逛富鐐崌綰с傜涓綰х殑涓葷偖鏄?0mm鐨勶紱絎簩綰х殑涓葷偖鍗囩駭鍒?20mm銆備富鐐垎涓ょ錛屼竴縐嶅彧鑳藉彂灝勭┛鐢插脊錛屽彟涓縐嶅彧鑳藉彂灝勯珮鐖嗗脊銆傚洜姝わ紝鍧﹀厠涔熷垎涓轟袱縐嶏細鑳芥墦絀跨敳寮圭殑鍜岃兘鎵撻珮鐖嗗脊鐨勩?br> 涓轟簡浣夸唬鐮佸鏄撳紑鍙戝拰緇存姢錛屾垜浠冭檻閲囩敤妯″潡鍖栫殑鏂瑰紡錛氬紑鍙戜竴涓潶鍏嬬殑妗嗘灦錛岀劧鍚庨氳繃鏇存崲涓嶅悓鐨勪富鐐紝瀹炵幇涓嶅悓縐嶇被鐨勫潶鍏嬪拰鍗囩駭錛?br> //涓浜涘熀鏈殑concept瀹氫箟
//鐐脊澶碿oncept
concept Warheads<typename T> {
double explode(TargetType tt); //鐐脊鐖嗙偢錛岃繑鍥炴潃浼ょ巼銆備笉鍚屽脊澶達紝瀵逛笉鍚岀被鍨嬬洰鏍囨潃浼ょ巼涓嶄竴鏍楓?br> }
//鐐脊concept錛屾垜浠叧蹇冪殑褰撶劧鏄脊澶達紝鎵浠ョ敤Warheads瀹氫箟涓涓猘ssociate type
concept Rounds<typename T> {
Warheads WH;
...
}
//涓葷偖concept
concept Cannons<typename T> {
Rounds R;
void T::load(R& r); //瑁呭~鐐脊錛宭oad涔嬪悗鐐脊浼氬瓨鏀懼湪鐐啗閲岋紝涓嶈兘鍐峫oad錛岄櫎闈炴妸鐐脊鎵撳嚭鍘?br> R::WH T::fire(); //寮鐐紝榪斿洖寮瑰ご銆傚彂灝勫悗鐐啗鍙樼┖錛屽彲浠ュ啀load
}
//綾誨瀷鍜屾ā鏉垮畾涔?br> //鍧﹀厠綾繪ā鏉?br> template<Cannons C>
class Tank
{
...
public:
void load(typenam C::R& r) {
m_cannon.load(r);
}
typename C::R::WH fire() {
return m_cannon.fire();
}
private:
C m_cannon;
};
//涓葷偖綾繪ā鏉?br> template<Rounds Rd>
class Cannon
{
public:
typedef Rd R;
void load(R& r) {...}
typename R::WH fire() {...}
}
template<Rounds Rd> concept_map Cannons<Cannon<Rd>>{}
//鐐脊綾繪ā鏉?br> template<Warheads W>
class Round
{
public:
typedef W WH;
static const int caliber=W::caliber;
W shoot() {...}
...
};
template<Warhead W> concept_map<Round<W>>{}
//寮瑰ご綾繪ā鏉匡紝閫氳繃traits鎶婂悇綾誨脊澶寸殑涓嶅悓琛屼負寮瑰ご鐨勪唬鐮佹鏋跺垎紱伙紝浣跨被鍨?#8220;鍙粍瑁?#8221;
concept WH_Traits<T> {
return T::exploed(int, TargetType, double, Material);
}
template<WH_Traits wht, int c>
class Warhead
{
public:
const static int caliber=c;
double explode(TargetType tt) {
return wht::exploed(c, tt, ...);
}
...
};
template<WH_Traits WHT, int c> concept_map<Warhead<WHT, c>>{}
//寮瑰ごtraits
struct KE_WHTraits
{
static double exploed(int caliber, TargetType tt, double weight, Material m) {...}
};
concept_map<KE_WHTraits>{}
struct HE_WHTraits
{
static double exploed(int caliber, TargetType tt, double weight, Material m) {...}
};
concept_map<HE_WHTraits>{}
//瀹氫箟鍚勭被寮瑰ご
typedef Warhead<KE_WHTraits, 90> WH_KE_90;
typedef Warhead<KE_WHTraits, 120> WH_KE_120;
typedef Warhead<HE_WHTraits, 90> WH_HE_90;
typedef Warhead<HE_WHTraits, 120> WH_HE_120;
//瀹氫箟鍚勭被鐐脊
typedef Round<WH_KE_90> Round_KE_90;
typedef Round<WH_KE_120> Round_KE_120;
typedef Round<WH_HE_90> Round_HE_90;
typedef Round<WH_HE_120> Round_HE_120;
//瀹氫箟鍚勭被涓葷偖
typedef Cannon<Round_KE_90> Cannon_KE_90;
typedef Cannon<Round_KE_120> Cannon_KE_120;
typedef Cannon<Round_HE_90> Cannon_HE_90;
typedef Cannon<Round_HE_120> Cannon_HE_120;
//瀹氫箟鍚勭被鍧﹀厠
typedef Tank<Cannon_KE_90> Tank_KE_90;
typedef Tank<Cannon_KE_120> Tank_KE_120;
typedef Tank<Cannon_HE_90> Tank_HE_90;
typedef Tank<Cannon_HE_120> Tank_HE_120;
浜庢槸錛屽綋鎴戜滑寮濮嬫父鎴忔椂錛屽氨鍙互鎸夌収鐜╁鐨勭駭鍒垱寤哄潶鍏嬪璞★紝騫朵笖灝勫嚮錛?br> //絎竴綰х帺瀹訛紝椹鵑┒鍙戝皠90mm楂樼垎鐐脊鐨勫潶鍏?br> Tank_HE_90 myTank;
Round_HE_90 r1;
myTank.load(r1);
myTank.fire();
//絎簩綰х帺瀹訛紝椹鵑┒鍙戝皠120mm絀跨敳寮圭殑鍧﹀厠
Tank_KE_120 yourTank;
Round_KE_120 r2;
yourTank.load(r2);
yourTank.fire();
//濡傛灉榪欐牱錛屽嵄闄╋紝鐐脊涓嶅尮閰嶏紝灝忓績鐐歌啗
myTank.load(r2); //error
鍒扮洰鍓嶄負姝紝榪欎簺浠g爜浠呬粎灞曠ず浜嗛潤鎬佺殑GP銆俢oncept鍦ㄨ繖閲屼篃鍙槸璧峰埌浜嗙被鍨嬪弬鏁扮害鏉熺殑浣滅敤銆備絾鏄紝鍦ㄨ繖浜涗唬鐮佷腑錛屾垜浠彲浠ユ槑鏄懼湴鐪嬪埌錛屽湪榪愮敤GP 鐨勫弬鏁板寲綾誨瀷鐗規т箣鍚庯紝鍙互寰堝鏄撳湴榪涜緇勪歡鍖栥傚浜庝竴緇勫叿澶囩被浼艱涓哄拰緇撴瀯鐗瑰緛鐨勭被鍨嬶紝鎴戜滑鍙互閫氳繃妯℃澘鐨勭被鍨嬪弬鏁幫紝灝嗗樊寮傞儴鍒嗘娊鍙栧嚭鏉ワ紝鐙珛鎴愭墍璋撶殑 “traits”鎴栬?#8220;policy”銆傚茍涓旈氳繃traits鎴杙olicy鐨勭粍鍚堟瀯鎴愪笉鍚岀殑浜у搧銆傚湪鏌愪簺澶嶆潅鐨勬儏鍐典笅錛宼raits鍜宲olicy榪樺彲浠ヨ繘涓姝ラ氳繃traits鎴杙olicy瀹炵幇緇勪歡鍖栥?br> 鎺ヤ笅鏉ワ紝寰堣嚜鐒跺湴搴斿綋灞曞紑runtime GP鐨勮繍鐢ㄤ簡銆?br> 涓涓父鎴忚呮槸鍙互鍗囩駭鐨勶紝涓轟簡浣垮緱榪欑鍗囩駭鍙樺緱鏇村姞鐏墊椿錛屾垜浠細寰堣嚜鐒跺湴浣跨敤Composite妯″紡銆傜幇鍦紝鎴戜滑鍙互鍦≧untime concept鐨勬敮鎻翠笅瀹炵幇GP鐗堢殑Composite妯″紡錛?br> //鍧﹀厠鐨刢oncept
concept tanks<T> {
typename Round;
void T::load(Round&);
Round::WH T::fire();
}
concept_map tanks<Tank_KE_90>{}
concept_map tanks<Tank_HE_90>{}
concept_map tanks<Tank_KE_120>{}
concept_map tanks<Tank_HE_120>{}
//鍧﹀厠鏋勯犲嚱鏁版ā鏉?br> template<tanks T>
T* CreateTank(WHType type, int level) { //WHType鏄竴涓灇涓捐〃鏄庣偖寮圭綾?br> switch(level)
{
case 1:
if(type==wht_KE)
return new tanks<Tank_KE_90>;
else
return new tanks<Tank_HE_90>;
case 2:
if(type==wht_KE)
return new tanks<Tank_KE_120>;
else
return new tanks<Tank_HE_120>;
default:
throw error("no such tank.");
}
}
//鐜╁綾?br> class player
{
public:
void update() {
m_pTank=CreateTank(m_tankType, ++m_level);
}
...
private:
int m_level;
WHType m_tankType;
tanks* m_pTank;
};
鍦ㄧ被player涓紝浣跨敤浜嗕竴涓猚oncept錛岃屼笉鏄竴涓被鍨嬶紝鏉ュ畾涔変竴涓璞°傛牴鎹墠闈㈡彁鍒扮殑concept鎺ㄥ瑙勫垯錛宮_pTank鎸囧悜涓涓姩鎬佸璞★紝榪樻槸闈欐佸璞★紝鍙栧喅浜庝負瀹冭祴鍊肩殑琛ㄨ揪寮忕被鍨嬫槸concept榪樻槸鍏蜂綋綾誨瀷銆傚湪update()鍑芥暟涓紝鍙互鐪嬪埌錛宮_pTank閫氳繃琛ㄨ揪寮?strong>CreateTank(m_tankType, ++m_level)璧嬪箋傞偅涔堣繖涓嚱鏁扮殑榪斿洖綾誨瀷錛屽皢鍐沖畾m_pTank鐨勭被鍨嬨侰reateTank()鏄竴涓ā鏉匡紝榪斿洖綾誨瀷鏄ā鏉垮弬鏁幫紝騫朵笖鏄鍚坈oncept tanks鐨勭被鍨嬨傚叧閿湪浜庝唬鐮佷腑鐨?strong>return new tanks<...>璇彞銆傚墠鏂囧凡緇忚榪囷紝榪欑褰㈠紡鏄嬌鐢?lt;...>涓殑綾誨瀷鍒涘緩涓涓鍚坱anks鐨勫姩鎬佸璞°傛墍浠ワ紝CreateTank()榪斿洖鐨勬槸鍔ㄦ佸璞°傞偅涔堬紝m_pTank涔熷皢鎸囧悜涓涓姩鎬佸璞°傚湪榪愯鏃訛紝褰撶帺瀹惰揪鍒頒竴瀹氭潯浠訛紝渚垮彲浠ュ崌綰с倁pdate()鎴愬憳鍑芥暟灝嗘牴鎹帺瀹剁殑綰у埆閲嶆柊鍒涘緩鐩稿簲鐨勫潶鍏嬪璞★紝璧嬪煎埌m_pTank涓?br> 榪欓噷錛屽疄闄呬笂鏄埄鐢╰anks榪欎釜concept鎻忚堪錛屽厖褰撶被鍨嬬殑鍏湁鎺ュ彛銆傚畠鎵鍏鋒湁鐨勭壒鎬у悓鍔ㄥ鎬佺殑鎶借薄鍩虹被鏄潪甯哥浉浼肩殑銆備絾鏄墍涓嶅悓鐨勬槸錛屽鍚屾垜鍦ㄤ唬鐮佷腑灞曠幇鐨勯偅鏍鳳紝concept浣滀負鎺ュ彛錛屽彲浠ュ湪浠諱綍鏃跺欏畾涔夛紝鍚岀被鍨嬬粦瀹氥傝屾棤闇璞℃娊璞″熀綾婚偅鏍鳳紝蹇呴』鍦ㄧ被鍨嬪畾涔変箣鍓嶅畾涔夈備簬鏄紝榪欑闈炰鏡鍏ュ紡鐨勬帴鍙g浉姣旀娊璞″熀綾繪嫢鏈夋洿鍔犵伒媧昏嚜鐢辯殑鐗規с?br> 鐒惰岋紝浜嬫儏榪樻病鏈夊畬銆傚湪榪涗竴姝ユ繁鍖栧潶鍏嬫渚嬪悗錛屾垜浠繕灝嗗彂鐜皉untime GP鎷ユ湁鏇村姞鏈夎叮鍜岄噸瑕佺殑鐗規с?br> 鍧﹀厠寮鐐負鐨勬槸鏀誨嚮鐩爣銆傚鐩爣鐨勬瘉浼ゆ儏鍐電洿鎺ュ叧緋誨埌鐜╁鐨勭敓瀛樺拰寰楀垎銆傛墍浠ワ紝鎴戜滑蹇呴』瀵瑰皠鍑誨悗錛岀洰鏍囩殑鎹熸瘉鎯呭喌榪涜璁$畻銆備簬鏄紪鍐欎簡榪欐牱涓緇勫嚱鏁幫細
double LethalityEvaluate(Target& t, double hitRate, WH_KE_90& wh) {...}
double LethalityEvaluate(Target& t, double hitRate, WH_HE_90& wh) {...}
double LethalityEvaluate(Target& t, double hitRate, WH_KE_120& wh) {...}
double LethalityEvaluate(Target& t, double hitRate, WH_HE_120& wh) {...}
Target鏄洰鏍囷紱hitRate鏄懡涓巼錛屾牴鎹潶鍏嬪拰鐩爣鐨勪綅緗佸皠鍑誨弬鏁扮患鍚堣綆楄幏寰楋紙濡傛灉鎯寵鏇寸湡瀹烇紝鍙互鍔犱笂椋庡悜銆侀鍔涖佹皵娓┿佹箍搴︺佹搗鎷旂瓑絳夊洜绱狅級錛泈h灝辨槸鍙戝皠鍑烘潵鐨勭偖寮逛簡銆傚嚱鏁拌繑鍥炴潃浼ょ巼銆傚姝わ紝鎴戜滑渚垮彲浠ュ湪灝勫嚮涔嬪悗榪涜璇勪及浜嗭細
double l=LethalityEvaluate(house, hr, myTank.fire());
鐜板湪錛屾父鎴忛渶瑕佽繘琛屼竴浜涙墿灞曪紝澧炲姞涓涓崌綰э紝鍏佽鍧﹀厠鍗囩駭鍒扮涓夌駭銆傚埌浜嗙涓夋瀬錛屼富鐐殑鍙e緞灝卞崌鍒板ご浜嗭紝浣嗗彲浠ュ崌綰у姛鑳斤紝鍙互鍙戝皠絀跨敳寮瑰拰楂樼垎寮廣傝繖鏍鳳紝鎴戜滑灝遍渶瑕佷竴涓?#8220;涓ょ敤”鐨勪富鐐被銆備絾鏄紝瀹為檯涓婂茍涓嶉渶瑕佺洿鎺ュ仛榪欎箞涓涓被錛屽彧闇瑕佺敤“涓ょ敤”鐨勫脊鑽潵瀹炰緥鍖朇annon妯℃澘錛?br> concept Warheads120<T> : Warheads<T> { //120mm鐐脊澶碿oncept
double LethalityEvaluate(Target& t, double hitRate, T& wh);
}
concept Rounds120<T> : Rounds<T> {}
concept_map Warheads120<WH_KE_120> {} //120mm鐨勭┛鐢插脊灞炰簬Warheads120
concept_map Warheads120<WH_HE_120> {} //120mm鐨勯珮鐖嗗脊灞炰簬Warheads120
template<WH120 WH> concept_map Rounds120<Round<WH>> {} //鎵鏈夊脊澶存槸Warheads120鐨勭偖寮歸兘鏄睘浜嶳ounds120
typedef Canon<Rounds120> Cannon120; //鐢≧ounds120瀹炰緥鍖朇annon妯℃澘錛屽緱鍒?#8220;涓ょ敤”涓葷偖
涓鍫嗙偒鐩殑concept鍜宑oncept_map涔嬪悗錛屽緱鍒癛ounds120錛屽氨鏄墍璋撶殑“涓ょ敤”寮硅嵂銆備綔涓轟竴涓猚oncept錛屽畠鍚屼袱縐嶇被鍨媘ap 鍦ㄤ竴璧鳳紝瀹為檯涓婂氨鎴愪簡榪欎袱涓被鍨嬬殑鎺ュ彛銆傚綋鎴戜滑浣跨敤Rounds120瀹炰緥鍖朇annon<>妯℃澘鏃訛紝涔熷氨鍒涘緩浜嗕竴涓?#8220;涓ょ敤鐨勪富鐐?#8221;錛堜嬌鐢?Rounds120寮硅嵂鐨勪富鐐級銆傚鏋滅敤榪欎釜Cannon120瀹炰緥鍖朤ank妯℃澘錛岄偅涔堝氨鍙互寰楀埌絎笁綰у潶鍏嬶紙瑁呬笂Cannon120涓葷偖鐨勫潶鍏嬪氨鏄涓夌駭錛夛細
typedef Tank<Cannon120> TankL3;
浜庢槸錛屾垜浠彲浠ヤ嬌鐢ㄤ笉鍚岀殑120mm寮硅嵂瑁呭~涓葷偖錛屽茍涓斿彂灝勭浉搴旂殑鐐脊錛?br> TankL3 tank_l3;
Round_KE_120 ke_round; //鍒涘緩涓鏋氱┛鐢插脊
Round_HE_120 he_round; //鍒涘緩涓鏋氶珮鐖嗗脊
tank_l3.load(ke_round); //瑁呭~絀跨敳寮?br> tank_l3.fire(); //鍙戝皠絀跨敳寮?br> tank_l3.load(he_round); //瑁呭~楂樼垎寮?br> tank_l3.fire(); //鍙戝皠楂樼垎寮?br> 鐜板湪錛屾垜浠妸娉ㄦ剰鍔涗粠娑堢伃鏁屼漢錛岃漿縐誨埌TankL3::load()鐨勫弬鏁扮被鍨嬪拰TankL3::fire()鐨勮繑鍥炵被鍨嬩笂銆傚湪涓綰у拰浜岀駭鍧﹀厠錛堢被鍨?Tank_KE_90絳夛級涓婏紝load()鎴愬憳鐨勫弬鏁扮被鍨嬫槸Round_KE_90絳夊叿浣撶殑綾誨瀷錛涜宖ire()鐨勮繑鍥炵被鍨嬩害鏄姝ゃ備絾TankL3鏄敤 Cannon120瀹炰緥鍖栫殑錛岃孋annon120鏄敤Rounds120榪欎釜concept瀹炰緥鍖栫殑銆傛牴鎹甌ank<>妯℃澘鐨勫畾涔夛紝 load()鎴愬憳鐨勫弬鏁扮被鍨嬪疄闄呬笂鏄ā鏉垮弬鏁頒笂鐨勪竴涓猘ssociate type銆傝岃繖涓猘ssociate type瀹為檯涓婂氨鏄疪ounds120銆傝繖鎰忓懗鐫load()瀹炰緥鍖栧悗鐨勭鍚嶆槸錛歷oid load(Rounds120& r)錛堣繖閲屾殏涓斿厑璁竎oncept浣滀負綾誨瀷鍙傛暟浣跨敤錛夈傚彧瑕佺鍚圧ounds120鐨勭被鍨嬮兘鍙互浣滀負瀹炲弬浼犻掔粰load()鎴愬憳銆傚悓鏍鳳紝fire()鎴愬憳鐨勮繑鍥炵被鍨嬫潵鑷簬Round120涓婄殑associate type錛屼篃鏄釜concept銆傚洜姝わ紝fire()瀹炰緥鍖栧悗鐨勭鍚嶆槸錛歐arheads120 fire()銆?br> 鎺ヤ笅鏉ュ煎緱娉ㄦ剰鐨勬槸fire()鎴愬憳銆傚畠榪斿洖綾誨瀷鏄竴涓猚oncept錛岄偅涔堣繑鍥炵殑灝嗘槸涓涓姩鎬佸璞°傚湪榪愯鏃訛紝瀹冨彲鑳借繑鍥濿H_KE_120鐨勫疄渚嬶紝涔熷彲鑳借繑鍥濿H_HE_120鐨勫疄渚嬶紝鍙栧喅浜庤繍琛屾椂load()鍑芥暟鎵瑁呭~鐨勭偖寮圭被鍨嬨傚綋鎴戜滑閲囩敤LethalityEvaluate()鍑芥暟瀵硅鐐脊鐨勬潃浼ゆ儏鍐佃繘琛岃瘎浼板皢浼氬嚭鐜版瘮杈冨井濡欑殑鎯呭喌錛?br> double x=LethalityEvaluate(hisTank, hr, tank_l3.fire());
榪欐椂鍊欙紝緙栬瘧鍣ㄥ簲褰撻夋嫨鍝釜LethalityEvaluate()錛熺敱浜巘ank_l3.fire()榪斿洖鐨勬槸涓涓姩鎬佸璞★紝鍏蜂綋鐨勭被鍨嬬紪璇戞椂涓嶇煡閬撱傚疄闄呬笂錛屽湪姝e畻鐨勯潤鎬佽璦涓紝榪欐牱鐨勮皟鐢ㄦ牴鏈棤娉曢氳繃緙栬瘧銆傚綋鐒訛紝緙栬瘧鍣ㄥ彲浠ラ氳繃runtime reflect鑾峰緱綾誨瀷淇℃伅錛岀劧鍚庡湪LethalityEvaluate()鐨勯噸杞戒腑鍖歸厤姝g‘鐨勫嚱鏁般傜劧鑰岋紝榪欑鍔ㄦ佽璦鍋氭硶浼氶犳垚鎬ц兘涓婄殑闂錛屼負闈欐佽璦鎵涓嶅睉銆?br> 浣嗘槸錛屽湪榪欓噷錛屽湪runtime concept鐨勪綔鐢ㄤ笅錛屾垜浠彲浠ヤ嬌榪欑璋冪敤鎴愪負闈欐佺殑銆佸悎娉曠殑錛屽茍涓旀槸楂樻晥鐨勩傝娉ㄦ剰鎴戝湪concept Warhead120鐨勫畾涔変腑鍔犲叆浜嗕竴涓猘ssociate function錛歞ouble LethalityEvaluate(Target& t, double hitRate, T& wh);銆俽untime concept浼氬緢蹇犲疄鍦板皢concept瀹氫箟涓殑associate function鏋勯犲埌涓涓嚱鏁版寚閽堣〃錛堟垜縐頒箣涓篶table錛変腑銆傦紙璇︾粏鎯呭喌璇風湅鏈枃闄勫綍鍜?a >榪欑瘒鏂囩珷鐨勯檮褰曪級銆傚洜姝わ紝涓巘ank_l3.fire()榪斿洖鐨勫姩鎬佸璞″疄闄呯被鍨嬪搴旂殑LethalityEvaluate()鍑芥暟鐗堟湰鐨勬寚閽堟鑰佽佸疄瀹炲湴韜哄湪鐩稿簲鐨刢table閲屻傛墍浠ワ紝鎴戜滑鍙互鐩存帴浠庡姩鎬佸璞′笂鑾峰緱鎸囧悜ctable鐨勬寚閽堬紝騫朵笖鎵懼嚭鐩稿簲鐨凩ethalityEvaluate()鍑芥暟鎸囬拡錛岀劧鍚庣洿鎺ヨ皟鐢ㄥ嵆鍙傛瘮濡傦細
tank_l3.load(ke_round);
double x=LethalityEvaluate(hisTank, hr, tank_l3.fire());
鍦ㄨ繖浜涗唬鐮佺殑鑳屽悗錛宬e_round閫氳繃load()瑁呭~鍏ヤ富鐐悗錛屼究鎽囪韓鍙樻垚浜嗕竴涓姩鎬佸璞°傜紪璇戝櫒浼氫負瀹冮檮鍔犱笂鎸囧悜ctable鐨勬寚閽堬紝鐒跺悗鍦ㄨ皟鐢?fire()鐨勬椂鍊欒繑鍥炴寚鍚戣繖涓姩鎬佸璞$殑寮曠敤銆傛鏃訛紝緙栬瘧鍣ㄥ彂鐜拌繖涓姩鎬佸璞℃墍瀵瑰簲鐨刉arhead120 concept涓婂凡緇忓畾涔変簡涓涓悕涓篖ethalityEvaluate()鐨刟ssociate function錛屽茍涓旂鍚嶄笌褰撳墠璋冪敤鐩哥銆備簬鏄紝渚垮彲浠ョ洿鎺ユ壘鍒癱table涓璍ethalityEvaluate()瀵瑰簲鐨勯偅涓嚱鏁版寚閽堬紝鏃犳墍欏懼繉鐨勮皟鐢ㄣ傜敱浜庝竴涓猚oncept鐨刟ssociate function鑲畾鏄悓瀹為檯綾誨瀷鍖歸厤鐨勫嚱鏁扮増鏈傛瘮濡傦紝瀵逛簬WH_HE_120鑰岃█錛屽畠鐨刟ssociate function LethalityEvaluate()鏄増鏈細double LethalityEvaluate(Target& t, double hitRate, WH_HE_120& wh) {...}銆傚叾浠栫増鏈殑LethalityEvaluate()閮芥棤娉曟弧瓚砪oncept Warhead120鏂藉姞鍦ㄧ被鍨媁H_HE_120涓婄殑綰︽潫銆?br> 榪欎釜鐗規у氨浣垮緱runtime concept浣滀負鎺ュ彛錛岀浉姣斿姩澶氭佺殑鎶借薄鎺ュ彛錛屽叿鏈夋洿澶х殑鐏墊椿鎬с傛娊璞℃帴鍙e彧琛ㄨ揪浜嗙被鐨勬垚鍛橈紝浠ュ強綾繪湰韜殑琛屼負錛屾棤娉曡〃杈劇被鍨嬪悓鍏朵粬綾誨瀷鐨勪簰鍔ㄥ叧緋伙紝鎴栬呰綾誨瀷闂寸殑浜や簰銆傝宑oncept鍚屾椂鎻忚堪浜嗘垚鍛樺嚱鏁板拰鐩稿叧鐨勮嚜鐢卞嚱鏁幫紙鍖呮嫭鎿嶄綔絎︼級錛屼嬌寰楃被鍨嬮棿鐨勫叧緋諱篃鍙互閫氳繃鎺ュ彛鐩存帴鑾峰緱錛屾棤闇鍐嶉氳繃 reflect絳夐棿鎺ョ殑鍔ㄦ佹墜孌點?br> 榪欎竴鐐瑰湪澶勭悊鍐呯疆綾誨瀷錛堝int銆乫loat錛夈侀緗被鍨嬶紙鏌愪簺搴撲腑鐨勭被鍨嬶級銆佺涓夋柟綾誨瀷絳変笉鏄撴垨鏃犳硶淇敼鐨勭被鍨嬫湁鑷沖叧閲嶈鐨勪綔鐢ㄣ傚湪OOP涓嬶紝鎴戜滑鏃犳硶杈撳嚭涓涓?#8220;鏁存暟”錛屾垨璁告槸short銆佹垨璁告槸long錛岀敋鑷蟲槸unsinged longlong銆備負姝わ紝鎴戜滑瑕佷箞鎶婂畠浠漿鎹㈡垚涓涓?#8220;鏈鍩虹綾誨瀷”錛圕/C++鐨剉oid*錛屾垨C#鐨凮bject*錛夛紝鐒跺悗榪愮敤rtti淇℃伅榪涜綾誨瀷杞崲錛屽啀鍋氬鐞嗭紱瑕佷箞浣跨敤variant榪欑綾誨瀷鍖呰錛堝氨鍍廋OM涓殑閭f牱錛夛紝鐒跺悗涓轟粬浠叏闈㈠畾涔変竴濂楄綆楀簱銆備絾runtime concept涓嶄粎浠呭厑璁歌緭鍑?#8220;鏁存暟”榪欐牱涓涓姩鎬佸璞★紝鑰屼笖榪樺皢鐩稿叧鐨勫悇縐嶆搷浣滈檮鍦ㄥ姩鎬佸璞′箣涓婏紝浣夸箣鏃犻渶鍊熷姪rtti鎴栬呰緟鍔╃被鍨嬩篃鍙繘琛屽悇綾誨鐞嗭紝灝卞鍚屽鐞嗗叿浣撶被鍨嬬殑瀵硅薄閭f牱銆?br> 浣嗘槸錛屽湪榪欓噷鎴戜粎浠呰冨療浜嗛拡瀵逛竴涓被鍨嬬殑concept錛堟殏涓旂О涔嬩負涓鍏僣oncept錛夛紝榪樻湭娑夊強涓や釜鍜屼袱涓互涓婄被鍨嬬殑concept錛堟殏涓旂О涓哄鍏?concept錛屾垨n-鍏僣oncept錛夈傚湪瀹為檯寮鍙戜腑錛屽鏁版搷浣滈兘浼氭秹鍙婂涓璞★紝姣斿涓や釜鏁扮浉鍔犮佷竴縐嶇被鍨嬭漿鎹㈡垚鍙︿竴縐嶃傛鏃訛紝鎴戜滑灝嗕細闈㈠澶氬厓鐨?concept銆備絾鏄鍏冪殑runtime concept鐨勭壒鎬ц繕涓嶆竻妤氾紝榪橀渶瑕佽繘涓姝ョ爺絀跺垎鏋愩?
鎬葷粨
鏈枃鍒濇灞曠ず浜嗗湪寮曞叆runtime concept涔嬪悗錛孏P鐨勫姩鎬佸寲鐗規с傚綊綰寵搗鏉ユ湁浠ヤ笅鍑犵偣錛?
緇間笂鎵榪幫紝鎴戜滑鍙互鐪嬪埌runtime GP鍦ㄤ笉鎹熷け鎬ц兘鐨勬儏鍐典笅錛屽叿澶囩浉姣斿姩澶氭佹洿鐏墊椿銆佹洿涓板瘜鐨勬墜孌點備粠鏍規湰涓婅岃█錛屼互concept涓烘牳蹇冪殑GP鎻愪緵浜嗘洿鍩虹鐨勬娊璞′綋緋伙紙鍏充簬榪欐柟闈㈡帰璁紝璇風湅鎴戠殑榪欑瘒鏂囩珷涓叧浜巆oncept瀵圭被鍨嬪垝鍒嗙殑浣滅敤閮ㄥ垎錛夈傛垨鑰呰錛宑oncept鐨勭被鍨嬫弿榪板拰綰︽潫浣滅敤浣撶幇浜嗙被鍨嬫娊璞$殑鏈川錛岃屽湪姝ゅ熀紜涓婅繘涓姝ヨ鐢熷嚭static鍜宺untime涓ょ鍏蜂綋鐨勪嬌鐢ㄦ柟寮忋傝繖涔熷氨鏄墍璋擄細閬撶敓涓錛屼竴鐢熶簩銆?)
闄勫綍
Runtime Concept瀹炵幇鏂規浜?/h4>
鎴戝湪榪欑瘒鏂囩珷闄勫綍閲岋紝緇欏嚭浜嗕竴縐嶅疄鐜皉untime concept鐨勫彲鑳芥柟妗堛傝繖閲岋紝鎴戣繘涓姝ュ榪欎釜鏂規鍋氫簡涓浜涙敼榪涳紝浣垮叾鏇村姞綺劇畝銆侀珮鏁堛?br> 鍋囪鎴戜滑鏈変竴涓猚oncept錛?br> concept Shape<T>
{
void T::load(xml);
void T::draw(device);
void move(T&);
}
鍙﹀錛岃繕鏈変竴涓唬琛ㄥ渾鐨刢oncept錛?br> concept Cycles<T> :
CopyConstructable<T>,
Assignable<T>,
Swappable<T>,
Shape<T>
{
T::T(double, double, double);
double T::getX();
double T::getY();
double T::getR();
void T::setX(double);
void T::setY(double);
void T::setR(double);
}
鐜板湪鏈夌被鍨婥ycle錛?br> class Cycle
{
public:
Cycle(double x, double y, double r);
Cycle(Cycle const& c);
Cycle& operator=(Cycle const& c);
void swap(Cycle const& c);
void load(xml init);
void draw(device dev);
double getX();
double getY();
double getR();
void setX(double x);
void setY(double y);
void setR(double r);
private:
...
};
鎴戜滑灝嗙被鍨婥ycle map鍒癱oncept Cycles涓婏細
concept_map Cycles<Cycle>{}
褰撴垜浠垱寤哄璞℃椂錛屽皢浼氬緱鍒板涓嬪浘鐨勭粨鏋勶細
int add_int(int lhs, int rhs);
float add_float(float lhs, float rhs);
int add(int lhs, int rhs);
float add(float lhs, float rhs);
class B
{
public:
void fun1();
virtual void fun2();
};
{
public:
void fun1();
void fun2();
};
int compare(int lhs, int rhs);
int compare(float lhs, float rhs);
int compare(string lhs, string rhs);
template<typename T> int compare(T lhs, T rhs) {
if(lhs==rhs)
return 0;
if(lhs>rhs)
return 1;
if(lhs<rhs)
return -1;
}
template<typename T> int compare(T* lhs, T* rhs) {
if(*lhs==*rhs)
return 0;
if(*lhs>*rhs)
return 1;
if(*lhs<*rhs)
return -1;
}
template<typename T>
struct comp_impl
{
int operator()(T lhs, T rhs) {
if(lhs==rhs)
return 0;
if(lhs>rhs)
return 1;
if(lhs<rhs)
return -1;
}
};
template<typename T>
struct comp_impl<T*>
{
int operator()(T* lhs, T* rhs) {
comp_impl<T>()(*lhs, *rhs);
}
};
template<typename T> int compare(T* lhs, T* rhs) {
comp_impl<T>()(*lhs, *rhs);
}
double **x, **y;
compare(x, y);
{
bool T::equal(T const& v);
};
return lhs.equal(rhs);
}
鍦?#8220;C++ Template”涓涔︿腑錛屽皢澶氭佹葷粨涓轟笁縐嶄富瑕佺被鍨嬶細runtime bound銆乻tatic unbound鍜宺untime
unbound銆傚叾涓璻untime bound灝辨槸鎴戜滑閫氬父鎵璇寸殑鍔ㄥ鎬侊紝OOP鐨勬牳蹇冩敮鏌憋紙騫夸箟涓奜OP榪樺寘鎷琌bject
Base錛圤B錛屼粎鎸囩被鍨嬪皝瑁呯瓑OO鐨勫熀鏈壒鎬э級錛屼絾鏈夋椂涔熶細灝哋B鍜孫OP鍒嗗紑錛孫OP鍗曟寚浠O涓哄熀紜鐨勫姩澶氭併傝繖閲屼嬌鐢ㄧ嫮涔夌殑OOP鍚箟錛夛紱
static unbound灝辨槸闈欏鎬侊紝閫氳繃妯℃澘瀹炵幇銆傝宺untime
unbound鍒欐槸涓縐嶄笉甯歌鐨勫艦寮忋傛棭騫寸殑SmallTalk鍏鋒湁榪欑褰㈠紡錛岀幇鍦ㄧ殑ruby涔熷紩鍏ヨ繖縐嶆満鍒躲?br>
鍦ㄤ富嫻佺殑錛堥潤鎬侊級璇█涓紝鎴戜滑浼氶潰涓翠袱縐嶇被鍨嬬殑澶氭侀渶姹傦細瀵逛簬緙栬瘧鏈熷彲浠ョ‘瀹氱被鍨嬬殑錛屼嬌鐢ㄩ潤澶氭侊紝姣斿瀹炰緥鍖栦竴涓鍣紱瀵逛簬榪愯鏈熸柟鑳界‘瀹氱被鍨嬬殑錛屽垯浣跨敤
鍔ㄥ鎬併傝宺untime
unbound涔熷彲浠ョ敤浜庤繍琛屾湡綾誨瀷鍐蟲柇銆備簬鏄紝渚挎湁浜嗕袱縐嶈繍琛屾湡澶氭併傝繖涓ょ澶氭佺殑鐗規у拰浠栦滑鐨勫樊寮傦紝鏄湰鏂囩殑鏍稿績銆傚疄闄呬笂錛岀浉姣斿姩澶氭侊紝
runtime unbound澶氭佷負鎴戜滑鎻愪緵浜嗘洿鏈川鐨勮繍琛屾椂澶氭佹墜孌碉紝鎴戜滑鍙互浠庝腑鑾峰緱鏇村ぇ鐨勬敹鐩娿備絾鏄壌浜庝竴浜涙妧鏈笂鐨勫洶闅撅紝runtime
unbound澶氭佹棤娉曡繘鍏ヤ富嫻佷笘鐣屻備笉榪囷紝鐢變簬鏂扮殑緙栫▼鎶鏈殑鍑虹幇錛屼嬌寰楄繖縐嶆洿濂界殑榪愯鏃跺鎬佸艦寮忓彲浠ュ悓鍔ㄥ鎬佷竴姣旈珮涓嬨?br>
鍔ㄥ鎬?nbsp;
搴熻瘽灝戣錛岃鎴戜滑浠庝竴涓佹帀鐗欑殑妗堜緥寮濮嬪惂錛氱紪鍐欎竴涓粯鍥劇▼搴忥紝鍥懼艦鍖呮嫭鐭╁艦銆佹き鍦嗐佷笁瑙掑艦銆佸杈瑰艦絳夌瓑銆傚浘褰粠鑴氭湰錛堟瘮濡倄ml錛変腑璇誨嚭錛屽垱寤哄悗淇濆瓨鍦ㄤ竴涓鍣ㄤ腑澶囨煡銆傞氳繃閬嶅巻瀹瑰櫒鎵ц鍥懼艦緇樺埗銆?br> 灝辮繖涔堜釜棰樼洰錛屽緢綆鍗曪紝涔熷緢鐔熸倝錛岃В閲奜OP鐨勫姩澶氭佹渶甯哥敤鐨勬渚嬨備笅闈㈡垜浠氨浠庡姩澶氭佸疄鐜板紑濮嬨?br> 棣栧厛瀹氫箟涓涓娊璞″熀綾伙紝涔熷氨鏄帴鍙o細
Runtime Unbound
Runtime Unbound澶氭佹販鍚堜簡闈欏鎬佸拰鍔ㄥ鎬佺殑鐗瑰緛錛屽嵆鏃㈡湁綾誨瀷娉涘寲錛屽張鏄繍琛屾椂鍐蟲柇鐨勩備竴涓渶鍏稿瀷鐨勪緥瀛愬氨鏄痳uby鐨勫嚱鏁幫細
class x
def fun(car)
car.aboard
end
end
榪欎釜妗堜緥闈炲父鏄庣‘鍦板睍紺哄嚭浜哛untime Unbound澶氭佺殑鐗圭偣銆俢ar鍙傛暟娌℃湁綾誨瀷錛岃繖閲屼篃涓嶉渶瑕佸叧蹇冪被鍨嬶紝鍙姹俢ar瀵硅薄鏈変竴涓猘board鏂規硶鍗沖彲銆傜敱浜巖uby鏄姩鎬佽璦錛岃兘澶熻繍琛屾椂媯嫻嬪璞$殑鐗瑰緛錛屽茍鍔ㄦ佽皟鐢ㄥ璞′笂鐨勬柟娉曘?br> 鍦≧untime Unbound鐨勬濇兂鎸囧涓嬶紝鎴戜滑鍒╃敤涓縐嶄吉閫犵殑“鍔ㄦ丆++”錛屾妸涓婇潰鐨勭粯鍥句緥瀛愰噸鏂扮紪鍐欙細
concept
闅忕潃C++0x閫愭笎嫻嚭姘撮潰錛宑oncept浣滀負姝ゆ鏍囧噯鏇存柊鐨勬牳蹇冮儴鍒嗭紝宸茬粡鍦–++紺劇兢涓紩璧峰叧娉ㄣ傞殢鐫鏃墮棿鐨勬帹縐伙紝concept鐨勬綔鍦ㄤ綔鐢ㄤ篃鍦ㄤ笉鏂鍙戞帢鍑烘潵銆?br> concept涓昏鐢ㄦ潵鎻忚堪涓涓被鍨嬬殑鎺ュ彛鍜岀壒寰併傞氫織鍦拌錛宑oncept鎻忚堪浜嗕竴緇勫叿澶囦簡鍏卞悓鎺ュ彛鐨勭被鍨嬨傚湪寮曞叆concept鍚庯紝C++鍙互瀵規ā鏉垮弬鏁拌繘琛岀害鏉燂細
concept assignable<T> {
T& operator=(T const&);
}
template<assignable T> void copy(T& a, T const& b) {
a=b;
}
榪欒〃紺虹被鍨婽蹇呴』鏈塷perator=鐨勯噸杞姐傚鏋滀竴涓被鍨媂娌℃湁瀵筼perator=榪涜閲嶈澆錛岄偅涔堝綋璋冪敤copy鏃訛紝渚夸細寮曞彂緙栬瘧閿欒銆傝繖浣垮緱綾誨瀷鍙傛暟鍙互鍦ㄥ嚱鏁頒嬌鐢ㄤ箣鍓嶄究鑳藉緱鍒版楠岋紝鑰屾棤闇絳夊埌瀵硅薄琚嬌鐢ㄦ椂銆?br> 鍙︿竴鏂歸潰錛宑oncept鍙備笌鍒扮壒鍖栦腑鍚庯紝浣垮緱鎿嶄綔鍒嗘淳鏇村姞鏂逛究錛?br> concept assignable<T> {
T& operator=(T const&);
}
concept copyable<T> {
T& T::copy(T const&);
}
template<assignable T> void copy(T& a, T const& b) { //#1
a=b;
}
template<copyable T> void copy(T& a, T const& b) { //#2
a.copy(b);
}
X x1,x2; //X鏀寔operator=鎿嶄綔絎?br> Y y1,y2; //Y鎷ユ湁copy鎴愬憳鍑芥暟
copy(x1, x2); //浣跨敤#1
copy(y1, y2); //浣跨敤#2
鍦ㄩ潤澶氭佷腑錛宑oncept寰堝ソ鍦版彁渚涗簡綾誨瀷綰︽潫銆傛棦鐒跺悓鏍鋒槸Unbound錛岄偅涔坈oncept鏄惁鍚屾牱鍙互琚敤浜嶳untime
Unbound錛熷簲褰撹鍙互錛屼絾涓嶆槸鐜版湁鐨刢oncept銆傚湪Runtime Unbound澶氭佷腑錛岄渶瑕佽繍琛屾椂鐨刢oncept銆?br>
渚濇棫浣跨敤緇樺浘妗堜緥鍋氫竴涓紨紺恒傚亣璁捐繖閲屼嬌鐢ㄧ殑"C++"宸茬粡鏀寔concept錛屽茍涓斾篃鏀寔浜嗚繍琛屾椂鐨刢oncept錛?br>
nShape(r, 10);
vector<float> vFloat; //闈欐佸璞$殑瀹瑰櫒錛屽唴閮ㄥ瓨鏀劇殑閮芥槸闈欐佸璞★紝灞炰簬鍚屼竴綾誨瀷float
vector<Shape> vShape; //鍔ㄦ佸璞$殑瀹瑰櫒錛屽唴閮ㄥ瓨鏀懼姩鎬佸璞★紝閮界鍚圫hape
鍚屼竴涓被妯℃澘錛屽綋浣跨敤綾誨瀷瀹炰緥鍖栵紝鎵цstatic unbound澶氭?/span>錛?span style="font-weight: bold;">浣跨敤concept瀹炰緥鍖栵紝鎵цruntime unbound澶氭?/span>銆備袱鑰呯殑褰㈠紡鐩稿悓銆備篃灝辨槸璇?strong>static澶氭佸悓runtime澶氭佷互鐩稿悓鐨勫艦寮忚〃杈?/strong>銆?
鐢變簬concept鐨勫姞鍏ワ紝涓ょ瀹屽叏涓嶅悓鐨勫鎬佽緇熶竴鍦ㄥ悓涓涓ā鍨嬪拰褰㈠紡涓嬨傚疄闄呬笂錛宻tatic鍜宺untime
unbound澶氭佸彲浠ョ湅浣滃悓涓涓娊璞′綋緋葷殑涓や釜鍒嗘敮錛屽垎鍒鐞嗕笉鍚屾儏鍐電殑搴旂敤銆傝屽艦寮忎笂鐨勭粺涓錛屽垯鏇村姞鎺ヨ繎鎶借薄浣撶郴鐨勬湰璐ㄣ傚悓鏃訛紝涔熶嬌寰椾袱縐?
unbound澶氭佺殑宸紓琚悗鍙板寲錛屼嬌鐢ㄨ呮棤闇棰濆鐨勫伐浣滐紝渚垮彲浠ュ悓鏃惰幏寰楀姩鎬佸拰闈欐佺殑鎶借薄鑳藉姏銆傚悓鏃訛紝涓ょ澶氭佹墍灞曠ず鐨勯昏緫涓婄殑瀵圭О鎬э紝涔熸殫紺轟簡涓よ呭湪
鏈川涓婄殑鑱旂郴銆傝繖閲岀粺涓鐨勫艦寮忥紝渚挎槸榪欑瀵圭О鎬х殑緇撴灉銆?br> 瀵逛簬妯℃澘鍑芥暟錛屽垯浼氳〃鐜板嚭鏇村姞鏈夎叮鐨勭壒鎬э紙榪欎釜鍑芥暟妯℃澘鏈変簺鐗瑰埆錛屼笉闇瑕乼emplate鍏抽敭瀛楀拰綾誨瀷鍙傛暟鍒楄〃錛岃繖鏄垜浼犵殑銆備絾鐢變簬concept鐨勪嬌鐢紝瀹冩湰璐ㄤ笂榪樻槸涓涓ā鏉匡級錛?br> void draw(Shape g);
榪欎釜鍑芥暟鎺ュ彈涓涓鍚圫hape鐨勫弬鏁般傚鏋滄垜浠敤涓涓潤鎬佸璞¤皟鐢ㄨ繖涓嚱鏁幫細
Rectangle r;
draw(r);
閭d箞錛屽氨鎵цstatic unbound錛屽疄渚嬪寲鎴愪竴涓畬瀹屾暣鏁寸殑鍑芥暟錛屽悓浼犵粺鐨勫嚱鏁版ā鏉夸竴鏍楓?br> 濡傛灉鐢ㄤ竴涓姩鎬佸璞¤皟鐢ㄨ繖涓嚱鏁幫細
Shape g=Cycle();
draw(g);
g=Rectangle();
draw(g);
閭d箞錛屽氨鎵цruntime unbound錛岀敓鎴愪竴涓瓑寰呰繍琛屾椂閾炬帴鐨勫嚱鏁般備笂闈㈢殑涓ゆ璋冪敤錛屽垎鍒繘琛屼簡涓ゆ榪愯鏃墮摼鎺ワ紝浠ュ尮閰嶄笉鍚岀殑鍔ㄦ佸璞°?br> 榪欐牱錛屾垜浠彲浠ラ氳繃鍑芥暟璋冪敤鏃剁殑鍙傛暟瀵硅薄錛屾潵鎺у埗浣跨敤涓嶅悓鐨勫鎬佸艦寮忋傛洿澶嶆潅鐨勬儏鍐靛氨鏄敤涓涓嚱鏁扮殑榪斿洖鍊艱皟鐢ㄥ彟涓涓嚱鏁幫紝榪欐牱鏋勬垚鐨勮皟鐢ㄩ摼渚濈劧絎﹀悎涓婅堪鐨勮皟鐢ㄦ帶鍒跺師鍒欍?br> 涓嬮潰錛屾垜浠皢鐪嬪埌Runtime Unbound澶氭佺殑涓涓簿褰╄〃婕旓細
//鍋囪錛屾垜浠凡緇忓畾涔変簡Rectangle銆丆ycle銆丼quare銆丒llipse銆乀rangle浜斾釜綾伙紝
// 鍒嗗埆map鍒癛ectangles銆丆ycles銆丼quares銆丒llipses銆乀rangles浜斾釜concept涓婏紝
// 榪欎簺concept閮絩efine錛堝彲浠ヤ笉姝g‘鍦扮悊瑙d負緇ф壙鍚э級鑷猄hape銆?br> void draw(monitor dev, Rectangles r); //#3
void draw(monitor dev, Cycles c); //#4
void draw(monitor dev, Squares s); //#5
void draw(monitor dev, Ellipses e); //#6
void draw(monitor dev, Trangles t); //#7
//姝ゅ瀹氫箟涓涓猄hape鐨勫姩鎬佸璞?br> Shape g=CreateShapeByUserInput(); //榪欎釜鍑芥暟鏍規嵁鐢ㄦ埛杈撳叆鍒涘緩鍥懼艦瀵硅薄錛屾墍浠ュ浘褰㈠璞$殑綾誨瀷鍙兘鍒拌繍琛屾椂浠庤兘紜畾銆?br> draw(crt, g);
濂戒簡錛岀幇鍦ㄨ璋冪敤鍝釜鐗堟湰鐨刣raw錛熸牴鎹敤鎴風殑杈撳叆鏉ャ傛崲鍙ヨ瘽璇達紝璋冪敤鍝釜鐗堟湰鐨刣raw錛屽彇鍐充簬CreateShapeByUserInput()鍑芥暟鐨勮繑鍥炵粨鏋滐紝涔熷氨鏄敤鎴瘋緭鍏ョ殑緇撴灉銆傚鏋?strong>CreateShapeByUserInput()
榪斿洖Rectangle鐨勫姩鎬佸璞★紝閭d箞鎵ц#3錛涘鏋滆繑鍥炵殑鏄疶rangle瀵硅薄錛岄偅涔堟墽琛?7銆傝繖鏄竴縐嶅姩鎬佸垎媧劇殑鎿嶄綔銆傚湪榪愯鏃禼oncept鐨勪綔
鐢ㄤ笅錛屽疄鐜拌搗鏉ラ潪甯稿鏄撱傚draw鐨勮皟鐢ㄦ渶緇堜細琚漿鎹㈡垚涓涓猚oncept闇姹傝〃錛屾潵鑷猟raw鍑芥暟錛屾瘡涓欏瑰搴斾竴涓嚱鏁扮増鏈紝騫朵笖鎸囨槑浜嗘墍瀵瑰簲鐨?
concept銆傚姩鎬佸璞′笂涔熸湁涓涓猚oncept琛紝姣忎竴欏瑰瓨鏀句簡榪欎釜瀵硅薄鎵絎﹀悎鐨刢oncept銆傜敤榪欎袱涓〃鐩鎬簰鍖歸厤錛屽彲浠ユ壘鍒癵瀵硅薄鐨?
concept鏈鍖歸厤鐨勯偅涓猟raw鐗堟湰錛岀劧鍚庤皟鐢ㄣ?br> 榪欏疄闄呬笂鏄皢閲嶈澆鍐蟲柇鏀懼埌榪愯鏃惰繘琛岋紝鑰宑oncept鍦ㄥ叾涓搗鍒頒簡鍖歸厤鍙傛暟鐨勪綔鐢ㄣ?br> 榪欐牱鐨勫仛娉曞悓鍒╃敤rtti淇℃伅鎵ц綾誨瀷鍒嗘淳璋冪敤綾諱技錛?br> void draw_impl(monitor dev, Rectangle& r);
void draw_impl(monitor dev, Cycle& c);
void draw_impl(monitor dev, Square& s);
void draw_impl(monitor dev, Ellipse& e);
void draw_impl(monitor dev, Trangle& t);
void draw_impl(monitor dev, Shape& g) {
if(typeif(g)==typeid(Rectangle))
draw_impl(dev, (Rectangle&)g);
else if(typeif(g)==typeid(Cycle))
draw_impl(dev, (Cycle&)g);
...
}
浣嗘槸錛屼粬浠嵈鏈夌潃澶╁¥涔嬪埆銆傞鍏堬紝rtti鍒嗘淳鏄鏡鍏ョ殑銆傚鏋滈渶瑕佸鍔犱竴涓浘褰紝闇瑕佸湪draw鍑芥暟涓鍔犲垎媧句唬鐮併傝孯untime Unbound鏂規鍒欏彧闇瑕佺敤鏂扮殑concept閲嶈澆draw鍑芥暟鍗沖彲銆?br>
鍏舵錛宺tti鐗堟湰鏈夊灝戝浘褰㈢被錛屽氨闇瑕佸灝慽f...else...錛岃孯untime
Unbound鍒欐槸涓瀵瑰鐨勩傚鏋滄湁鍑犱釜鍥懼艦綾誨唴瀹逛笉鍚岋紝浣嗘湁鐩稿悓鐨勬帴鍙o紝絎﹀悎鍚屼竴涓猚oncept錛岄偅涔堝彧闇閽堝concept緙栧啓涓涓嚱鏁扮増鏈嵆鍙?
姣斿錛屽鏋滄湁涓涓壒鍒殑CycleEx綾伙紝浣跨敤澶栫晫姝f柟褰㈢殑宸︿笂瑙?鍙充笅瑙掑潗鏍囨弿榪幫紝姝eソ絎﹀悎Ellipses
concept錛岄偅涔堝彧闇灝咰ycleEx map鍒癊llipses涓婂嵆鍙紝鏃犻渶澶氬姞浠諱綍浠g爜銆?br> 鏈鍚庯紝rtti闇瑕佽幏鍙栫被鍨嬩俊鎭紝鐒跺悗鍋氱嚎鎬ф瘮杈冿紝鎬ц兘鏃犳硶浼樺寲銆備絾Runtime Unbound閫氳繃concept琛ㄧ殑鐩鎬簰鍖歸厤錛屼粎鐗墊秹鏁板兼搷浣滐紝鏈夊緢澶х殑浼樺寲絀洪棿銆?br>
閭d箞榪欐牱涓縐嶈繍琛屾椂鍒嗘淳鏈変粈涔堝ソ澶勫憿錛熸垜浠湅鍒板浘褰㈢被涓婄殑draw鍑芥暟鎺ュ彈涓涓猰onitor綾誨瀷鍙傛暟錛屽畠浠h〃璁懼銆傚鏋滃摢涓澶╅渶瑕佸悜鍙︿竴縐嶈澶囷紝姣斿
printer錛岃緭鍑哄浘褰紝閭d箞灝遍渶瑕佸湪鍥懼艦綾諱笂澧炲姞鍙︿竴涓増鏈殑draw鍑芥暟銆傚鏋滅被鏄埆浜哄紑鍙戠殑錛岄偅涔堝氨澧炲姞娌熼氱殑璐熸媴銆傚鏋滅被鏄鏉ョ殑錛屾垜浠棤娉曚慨
鏀癸紝閭d箞鍙兘閫氳繃adapter涔嬬被鐨勭鎷欐墜孌靛鐞嗐備負浜嗚monitor涔嬬被鍚屽浘褰㈡湰韜病鏈夊叧鑱旂殑涓滆タ鍒嗙錛屽簲褰撲嬌鐢ㄨ嚜鐢卞嚱鏁版墽琛宒raw鎿嶄綔銆備絾鏅?
鍑芥暟鍙兘鎺ュ彈紜畾鐨勭被鍨嬮噸杞斤紝鑰屼紶緇熺殑鍑芥暟妯℃澘鍒欓檺浜庣紪璇戞湡浣跨敤錛屾棤娉曡繘琛岃繍琛屾椂鍒嗘淳銆傛墍浠ワ紝濡傛灉鑳藉浣跨敤concept閲嶈澆鍑芥暟錛屽茍涓旇祴浜?
Runtime Unbound鏈鴻兘錛岄偅涔堜究鍙互鐢ㄦ渶綆鍗曠殑褰㈠紡閽堝涓綾葷被鍨嬭繘琛屽鐞嗭紝鏁堣兘楂樺緱澶氥?br>
榪愯鏃禼oncept
Runtime Unbound鍜孯untime Bound
瀵逛簬runtime unbound鍚宺untime bound涔嬮棿鐨勫樊寮傚墠闈㈠凡緇忔湁鎵灞曠ず銆傚湪鍏朵粬鏂歸潰錛屼袱鑰呰繕瀛樺湪鏇村鐨勫樊鍒?br> 棣栧厛錛屽氨鍍忕粯鍥炬渚嬩腑灞曠ず鐨勯偅鏍鳳紝runtime unbound鏄潪渚靛叆鐨勩俽untime unbound涓嶈姹傜被鍨嬬戶鎵胯嚜鍚屼竴綾誨瀷錛屽彧闇灝嗙被鍨嬪悓concept鍏寵仈璧鋒潵渚垮彲銆?br> 鍏舵錛宑oncept涓嶆槸涓縐嶅眬闄愪簬OO鐨勬妧鏈紝涓嶄粎娑夊強鎴愬憳鍑芥暟錛岃繕鍖呮嫭浜嗚嚜鐢卞嚱鏁幫紝鑼冨洿鏇村箍錛屾洿鍔犵伒媧匯?br>
鏈鍚庯紝瀹炵幇涓婏紝Runtime Unbound鍜孯untime
Bound涔嬮棿鏈夋儕浜虹殑鐩鎬技涔嬪銆備袱鑰呴兘閲囩敤涓涓嚱鏁版寚閽堣〃浣滀負鎿嶄綔鍒嗘淳錛涢兘閲囩敤涓涓寚鍚戝嚱鏁拌〃鐨勬寚閽堜綔涓哄叆鍙o紱涓涓姩鎬佸璞′笂鐨刢oncept涔嬮棿鐨勮漿
鎹紝涔熷悓鍔ㄥ鎬佸璞′竴鏍鳳紝鍦ㄤ笉鍚岀殑鍑芥暟琛ㄩ棿鍒囨崲銆備粬浠敮涓鐨勪笉鍚岋紝鏄疄鐜版帴鍙g殑鏈哄埗銆?br> 鍔ㄥ鎬佺敤綾誨瀷鍏間換鎺ュ彛錛岄氳繃緇ф壙鍜岃櫄鍑芥暟瀹炵幇鎺ュ彛鐨勫姛鑳姐傜敤綾誨瀷浣滀負綾誨瀷鐨勬帴鍙o紝浣垮緱榪欎袱涓湰鏉ョ嫭绔嬬殑姒傚康浜ょ粐鍦ㄤ竴璧楓傚鍔犳暣涓被鍨嬩綋緋葷殑澶嶆潅搴﹀拰鑰﹀悎搴︺?nbsp; concept鍒欏埄鐢ㄧ嫭绔嬬殑緋葷粺鎻忚堪銆佽〃杈懼拰綆$悊鎺ュ彛銆傜被鍨嬪垯鍥炲綊鍒拌〃杈句笟鍔″璞$殑鍔熻兘涓婃潵銆?br>
鍔ㄥ鎬佸湪浣跨敤綾誨瀷琛ㄨ揪鎺ュ彛鐨勬椂鍊欙紝渚垮緢瀹規槗鍦板紩鍏ヤ竴涓夯鐑︾殑闂錛岃〃杈懼姛鑳界殑綾誨瀷鍜岃〃杈炬帴鍙g殑綾誨瀷娣峰悎鍦ㄤ竴璧鳳紝浣跨敤鏃跺繀欏婚氳繃涓浜涙柟娉曞尯鍒嗗嚭鍝簺鏄帴鍙o紝
鍝簺鏄姛鑳界被鍨嬨傝繖澧炲姞浜嗗璞℃ā鍨嬬殑澶嶆潅鎬с傝宑oncept鍒欑嫭绔嬩簬綾誨瀷浣撶郴涔嬪錛屾墍鏈夊鎺ュ彛鐨勬搷浣滈兘鏄崟涓鐨勶紝媯绱㈠拰鍖歸厤鏉ュ緱鏇村姞鏂逛究蹇嵎銆?br> 浣滀負緇ф壙浣撶郴鐨勫熀紜閮ㄥ垎錛屽姩澶氭佺殑鎶借薄鎺ュ彛蹇呴』鍦ㄧ戶鎵跨粨鏋勭殑鏈欏剁銆傞偅涔堣繖浜涙娊璞$被鍨嬪繀欏誨厛浜庡叾浠栫被鍨嬪嚭鐜般傝繖瀵圭郴緇熺殑鏃╂湡璁捐浜х敓寰堝ぇ鐨勫帇鍔涳紝寰寰涓涓熀紜鎶借薄鎺ュ彛璁捐鏈夎錛屼究浼氶犳垚鏁翠釜浣撶郴鐨勫彉鏇淬?br> 鑰宑oncept鏄嫭绔嬩簬綾誨瀷鐨勶紝閭d箞浠諱綍鏃跺欓兘鍙互灝嗕竴涓被鍨嬪悓鎺ュ彛緇戝畾銆傛帴鍙g敋鑷沖彲浠ュ湪綾誨瀷浣撶郴鍩烘湰寤虹珛涔嬪悗鎵嶇‘瀹氥傝繖縐嶇伒媧繪у澶嶆潅杞歡鐨勫紑鍙戣嚦鍏抽噸瑕侊紝鍘繪帀浜嗛暱鏈熶互鏉ュ鍦ㄤ漢浠ご涓婄殑鏋烽攣銆?br>
鍓嶉潰宸茬粡鎻愬埌錛屽湪涓嶉渶瑕乧oncept杞崲鐨勬儏鍐典笅錛屾棤闇鎵ц榪愯鏃剁殑concept鍖歸厤錛屾墍鏈夌殑璋冪敤鍏鋒湁鍚屽姩澶氭佷竴鏍風殑鏁堢巼錛堥兘鏄棿鎺ヨ皟鐢級銆傚湪鎵ц
concept杞崲鏃訛紝鏃犻渶璞″姩澶氭侀偅鏍峰湪澶嶆潅鐨勭戶鎵夸綋緋諱笂媯绱紝鍙渶鎵цconcept琛ㄧ殑hash鍖歸厤錛屾晥鐜囧弽鑰屾洿楂橈紝鑰屼笖鏇寸畝鍗曘傝冭檻鍒拌繖浜涙儏鍐碉紝
鎴戜滑鍙互璁や負concept鍖栫殑Runtime Unbound澶氭佸畬鍏ㄨ兘澶熸浛浠d紶緇熺殑鍔ㄥ鎬?/strong>銆備篃灝辨槸璇達紝鎴戜滑涓嶅啀闇瑕佸姩澶氭佷簡銆?br>
鎯寵薄涓涓嬶紝濡傛灉涓闂ㄨ璦鑳藉鎷ユ湁榪愯鏃禼oncept錛岄偅涔堝畠瀹屽叏鍙互鍙繚鐣橲tatic Unbound鍜孯untime
Unbound澶氭侊紝鑰屾斁寮僐untime
Bound澶氭併備竴鏃︽斁寮冨姩澶氭?娌℃湁浜嗚櫄鍑芥暟鍜岃櫄琛?錛岄偅涔堝璞℃ā鍨嬩究鍙互澶уぇ綆鍖栥傛墍鏈夊璞″彧闇瑕佺嚎鎬у垎甯冿紝鍩虹被鍜屾垚鍛樹緷嬈″爢鍙犲湪涓璧鳳紝涔熸病鏈?
vtable鐨勫共鎵幫紝瀵硅薄緇撴瀯鍙互鍋氬埌鏈綆鍗曘傚悓鏃訛紝緇ф壙涔熷洖褰掍簡浠g爜閲嶇敤鐨勪紶緇熺敤閫斻傝屼笖錛屽璞$嫭绔嬩簬鎺ュ彛瀛樺偍錛屽湪鑳藉鍦ㄧ紪璇戞椂闈欐侀摼鎺ョ殑鏃跺欙紝鍙互浣?
涓洪潤鎬佸璞′嬌鐢ㄣ傝屽湪闇瑕佸姩鎬佸璞$殑鍦版柟錛屽張鍙互寰堝鏄撳湴杞崲鎴愬姩鎬佸璞★紝鍙渶瑕佷負鍏墮檮涓奵oncept琛ㄥ拰ctable銆備竴鍒囬兘綆鍖栦簡銆傚璞℃ā鍨嬩篃鏇村姞
瀹規槗緇熶竴銆?br>
榪欏浜庡緢澶氬簳灞傚紑鍙戠殑紼嬪簭鍛樺浜巆++澶嶆潅鑰屽張娣蜂貢鐨勫璞℃ā鍨嬮毦浠ユ帴鍙椼傚鏋滆兘澶熷簾闄よ櫄鍑芥暟錛岀畝鍖栧璞℃ā鍨嬶紝閭d箞瀵逛簬榪欎簺搴曞眰寮鍙戣岃█錛屽皢浼氬甫鏉ョ洿鎺ョ殑濂?
澶勩傚彧瑕佺‘淇濅笉浣跨敤concpt瀹氫箟瀵硅薄銆佸疄渚嬪寲妯℃澘錛屼究鍙互浣挎暣涓蔣浠舵墽琛孲tatic
Unbound銆傝繖鐩稿綋浜庡幓鎺塐OP鐨凜++銆傚惁鍒欙紝灝卞惎鐢≧untime Unbound錛屽疄鐜拌繍琛屾椂澶氭併?br>
鎬葷粨
Static Unbound鍜孯untime
Unbound浣滀負涓瀵逛翰瀵嗘棤闂寸殑澶氭佹妧鏈紝浣撶幇浜嗘渶瀹屽杽鐨勬娊璞″艦寮忋備袱鑰呭悇韙炰竴鏂癸紝鐩鎬簰琛ュ厖錛岀浉浜掓敮鎻淬傝屼笖涓よ呭叿鏈夌粺涓鐨勮〃鐜板艦寮忥紝澶уぇ鏂逛究浜嗕嬌鐢紝
瀵逛簬杞歡宸ョ▼鍏鋒湁闈炲嚒鐨勬剰涔夈傚彟涓鏂歸潰錛孯untime
Bound澶氭佷綔涓篛O鏃朵唬鐨勪駭鐗╋紝浣撶幇浜嗛潤鎬佺被鍨嬭璦鍦ㄨ繍琛屾椂澶氭佹柟闈㈢殑鏈澶у姫鍔涖備絾鏄紝闅忕潃榪愯鏃禼oncept鐨勫紩鍏ワ紝Runtime
Unbound澶氭佽嚜韜瓨鍦ㄧ殑闈欐佺被鍨嬪畨鍏ㄩ棶棰樺拰鎬ц兘闂錛岄兘鑳藉寰楀埌寰堝ソ鐨勮В鍐熾傝嚦姝わ紝Runtime Unbound渚垮叿澶囦簡鏇夸唬Runtime
Bound鐨勫疄鍔涖傜浉淇″湪涓嶄箙鐨勫皢鏉ワ紝Runtime Bound灝嗕細閫愭笎姝ュ叆瀹冪殑榛勬槒銆?br>
鍙傝?/h2>
闄勫綍 Runtime Concept鐨勫叿浣撳疄鐜?/h2>
鎴戜滑鏈変竴涓猚oncept錛?br> concept Shape<T>
{
void T::load(xml);
void T::draw(device);
void move(T&);
}
鍙﹀錛岃繕鏈変竴涓唬琛ㄥ渾鐨刢oncept錛?br> concept Cycles<T> :
CopyConstructable<T>,
Assignable<T>,
Swappable<T>,
Shape<T>
{
T::T(double, double, double);
double T::getX();
double T::getY();
double T::getR();
void T::setX(double);
void T::setY(double);
void T::setR(double);
}
鐜板湪鏈夌被鍨婥ycle錛?br>
class Cycle
{
public:
Cycle(double x, double y, double r);
Cycle(Cycle const& c);
Cycle& operator=(Cycle const& c);
void swap(Cycle const& c);
void load(xml init);
void draw(device dev);
double getX();
double getY();
double getR();
void setX(double x);
void setY(double y);
void setR(double r);
private:
...
};
褰撳畾涔変竴涓姩鎬佸璞★細
Shape g=Cycle();
渚夸細褰㈡垚濡備笅鍥劇殑緇撴瀯錛?br>
閭d箞錛屽皢浼氭墽琛屼竴涓悳绱紝鐢╟oncept
Swappable鐨刬d錛堟瘮濡俬ash鐮侊級鍦╟oncept琛ㄤ腑媯绱㈡槸鍚﹀瓨鍦⊿wappable欏廣傚鏋滃瓨鍦紝灝卞皢瀵瑰簲欏圭殑鎸囬拡璧嬬粰h銆傝繖縐嶆搷浣滃悓
dynamic_cast鎿嶄綔闈炲父鐩鎬技錛屽彧鏄浉姣斿湪澶嶆潅鐨勫璞$粨鏋勪腑鏌ヨ鏇村姞綆鍗曡繀閫熴?br>
concept琛ㄧ疆浜庡璞$殑澶撮儴鎴栧熬閮紝榪欐槸涓轟簡渚夸簬瀵硅薄媯绱oncept鎺ュ彛銆傛瘡涓被鍨嬬殑ctable鍙渶涓浠姐?br>
瀵硅薄鏈綋鍙互寰堝鏄撳湴鍚宑oncept琛ㄥ垎紱伙紝鍦ㄥ畬鍏ㄩ潤鎬佺殑鎯呭喌涓嬶紝concept琛ㄦ槸涓嶉渶瑕佺殑銆傚鏋滈渶瑕乺untime澶氭侊紝鍔犱笂concept琛ㄥ嵆鍙?br>