锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍦ㄢ渁sgard欏圭洰閬楃暀闂鈥濅腑錛屾垜綆鍗曟彁鍒頒簡鍑犱釜闂錛屽茍涓旀兂浜嗕竴浜涜В鍐蟲柟妗堛?BR>
鍏朵腑錛屾渶棣栬瑙e喅鐨勬槸絎?鏉♀滄湇鍔″璞$殑澶у皬鈥濆拰絎?鏉♀滃叏灞鍏冧俊鎭濓紝榪?鏉″皢褰卞搷鍒拌皟鐢ㄦ満鍒躲乧all瀵硅薄鐨勭敓鎴愩備竴涓皟鐢ㄥ皢鐢熸垚涓涓猚all瀵硅薄錛岀敱綰跨▼姹犳潵澶勭悊錛屽悓姝ヨ皟鐢ㄥ皢鐢卞紓姝ヨ皟鐢ㄦ潵妯℃嫙銆?BR>
鍦╟all瀵硅薄涓紝淇濆瓨浜嗘墍鏈塱n/out鍙傛暟鐨勫寘瑁呭璞°傚綋澶勭悊鍚屾璋冪敤鏃訛紝鐢變簬out鍙傛暟鍙兘鏄竴涓爤涓婂璞★紙鎴栫畝鍗曠被鍨嬶紝榪欓噷緇熺О瀵硅薄錛夛紝鎵浠ラ渶瑕佸彟涓涓寘瑁呯被鈥斺攐utret妯℃澘綾伙紝瀹冧繚瀛榦ut鍙傛暟鐨勫紩鐢ㄣ?BR>
褰撳悓姝ヨ皟鐢ㄥ彂鐢熸椂錛岀敓鎴愪竴涓猚all瀵硅薄錛堝綋鐒秓ut鍙傛暟鐨勫紩鐢ㄥ凡緇忓寘鍚湪閲岄潰錛夛紝鎶婅繖涓猚all瀵硅薄浜ょ粰綰跨▼姹犲鐞嗭紝璋冪敤鐨勭嚎紼嬮樆濉炵瓑寰呰皟鐢ㄧ粨鏉熷悗琚敜閱掞紝榪欏氨鏄墍璋撶殑寮傛璋冪敤妯℃嫙鍚屾璋冪敤銆傜敱浜庡紓姝ヨ皟鐢ㄨ鍖呰璧鋒潵浜嗭紝鎵浠ュ湪璋冪敤鑰呯湅鏉ヨ窡鍚屾璋冪敤娌′粈涔堝尯鍒傚綋鐒惰繖涓姩浣滃茍闈炲繀瑕侊紝瀹屽叏鍙互涓嶄嬌鐢ㄦā鎷燂紝鑰岄噰鐢ㄧ湡姝g殑鍚屾璋冪敤錛屽彧鏄湅鍒癐CE鏄繖涔堝疄鐜扮殑錛屽績鐥掔棐鑰屽凡銆?BR>
asgard鐨勭洰鏍囨槸鎶婄幇鏈夌殑緋葷粺鍔熻兘鍖呰鎴愪負鏈嶅姟錛屾墍浠ュ湪閫氱敤鏂歸潰鎴戣冭檻寰楁瘮杈冨銆?BR>
姣斿鏈嶅姟绔寮鏀句笅闈㈣繖鏍蜂竴涓湇鍔★細
{
Method <string(inout<string>, in<string>)> strcat;
Method <string(inout<string>, in<string>, in<uint>)> strncat;
};
騫朵笖鎶奀鏍囧噯搴撲腑鐨剆trcat鍜宻trncat浣滀負榪?涓柟娉曠殑瀹炵幇銆?BR>
鐪嬩竴涓嬪瓨鍦ㄥ摢浜涢棶棰橈紵
1銆佸嚱鏁扮1涓弬鏁板鏋滅洿鎺ユ槧灝勪負string錛屽湪鏈嶅姟绔皢鍑虹幇緙撳啿鍖烘孩鍑恒?BR>
2銆丆鏍囧噯搴撲腑鐨剆trcat榪斿洖鍊兼槸涓涓寚閽堬紝瀹冩寚鍚憇trcat鐨勭涓涓弬鏁幫紙鎼炶繖涓爣鍑嗗簱鐨勪漢鏄笉鏄病鎯寵繃榪欎釜榪斿洖鍊煎涔堟病鐢ㄥ晩錛燂紵鐩存帴榪斿洖涓涓搷浣滅殑闀垮害涓嶆槸鏇村ソ錛燂級錛屽湪鏈嶅姟绔彂鍥炲鎴風鏃訛紝榪欎釜騫朵笉闇瑕佽鍙戝洖鏉ワ紝鍥犱負strcat鐨勭1涓弬鏁板凡緇忚兘甯﹀洖鎿嶄綔鍚庣殑鍐呭浜嗐?BR>
3銆乻trncat鐨勭3涓弬鏁拌〃紺虹1涓紦鍐插尯鍙傛暟鐨勯暱搴︼紝濡傛灉鑳芥妸瀹冨拰絎?涓弬鏁板悎璧鋒潵鐢ㄤ竴涓猙uffer瀵硅薄琛ㄧず錛屽氨鑳界渷浜嬩簡銆?BR>
鐞嗘兂鎯呭喌涓嬶紝鎴戜滑鐨勬湇鍔″璞¤繖鏍鋒潵鍐欙細
{
Method <void(inout< buffer<char> >, in<string>)> strcat;
Method <void(inout< buffer<char> >, in<string>)> strncat;
};
鎴戜滑鐨勭洰鐨勬槸鎶婅佺殑浠g爜鍖呰鎴愭柊椴滄椂楂︾殑鏈嶅姟錛屽綋鐒朵笉鐢ㄤ繚鐣欒佸紡浠g爜涓殑鎸囬拡錛屼互鍙婁嬌鐢ㄦ寚閽堝拰闀垮害2涓兼潵琛ㄧず涓涓紦鍐插尯鐨勫仛娉曘俠uffer綾誨湪鏋勯犳椂瑕佹帴鍙椾竴涓猻ize_t鍙傛暟錛屾寚瀹氱紦鍐插尯鐨勫ぇ灝忋?BR>
榪欏湪鏈嶅姟绔皢浜х敓鏄犲皠闂錛岀敱浜庤繖涓狹ethod瀹氫箟鐨勫艦寮忓拰C鏍囧噯搴撲腑鐨勫嚱鏁板艦寮忎笉涓鑷淬?BR>
鎴戞兂搴旇鍘誨疄鐜頒竴涓傞厤鍣ㄦā鏉跨被錛屾瘮濡傦細
this->strncat.setFunction (adapter<char*(char*, const char*, size_t), convert<void, 0>(inout< buffer<char> >, in<string>, length<in<uint>, 1>)> (::strncat));
convert<void, 0>琛ㄧず鎶婄0涓弬鏁幫紙榪欓噷鎸囪繑鍥炲鹼級杞垚void綾誨瀷錛宭ength<in<uint>, 1>琛ㄧず榪欎釜鍙傛暟綾誨瀷鏄痠nt<uint>錛屽畠鏄粠絎?涓弬鏁頒腑鎻愬彇鐨勯暱搴︼紝澶ц嚧灝辨槸浣跨敤榪欑瑙勫垯錛岃娉曞彲鑳戒互鍚庝細鏈夊彉鍔ㄣ?BR>
榪欑偣鍐呭鏄垜鍑犱釜鏈堝墠灝卞湪鑰冭檻鐨勶紝涔熸槸鎴戞兂鍋氳繖涓」鐩殑鍔ㄦ満錛屼笉榪囩洿鍒版渶榪戜竴孌墊椂闂存墠浠庡彲琛屾ф柟闈粩緇嗚冭檻銆?BR>
閫氳繃鍓嶉潰鍑犱釜妯℃澘鐨勭粌涔狅紝鐜板湪宸茬粡澶ц嚧鐭ラ亾鍝簺涓滆タ鏄彲浠ョ敤妯℃澘鍋氬嚭鏉ワ紝鍝簺涓嶈兘浣跨敤妯℃澘錛岃繖搴旇鏄渶澶х殑鏀惰幏浜嗐傚緢澶氫笢瑗垮崟闈犳ā鏉挎垨鏄櫄鍑芥暟閮戒笉濂藉畬鎴愶紝浣嗙粨鍚堣搗鏉ュ氨鑳戒駭鐢熸剰鎯充笉鍒扮殑鏁堟灉銆?BR>
鍙堜粩緇嗘兂浜嗕竴涓嬶紝涓婇潰鐨勪唬鐮佸簲璇ヨ繕鍙互淇敼綆鍖栵細
this->strncat.setFunction (adapter<convert<void, 0>(inout< buffer<char> >, in<string>, length<in<uint>, 1>)> ( ) (::strncat));
浣跨敤涓涓豢鍑芥暟鏉ュ仛錛屽嚱鏁版寚閽堢殑綾誨瀷鍙互浠巓perator ()鐨勫弬鏁幫紙妯℃澘鍙傛暟錛変腑鎺ㄥ鍑烘潵銆?img src ="http://m.shnenglu.com/cpunion/aggbug/481.html" width = "1" height = "1" />
]]>
閫氳繃絎?銆佺4鏉$殑浠旂粏鐮旂┒錛屽凡緇忔笎娓愬畬鍠勩佹槑紜簡鍔ㄦ侀儴鍒嗗拰闈欐侀儴鍒嗙殑鍏崇郴錛屼嬌寰桵ethod鍖呰綾繪墍瀹屾垚鐨勫姛鑳芥笎娓愭帴榪戜簬涓涓嚱鏁幫紝鑰屽厓淇℃伅鍒欒劚紱誨叿浣撶殑瀵硅薄鎻愬崌鍒板叏灞錛堝綋鐒惰繕鏈変簺灝忛棶棰樻病鏈夎В鍐籌級銆?BR>
1銆佸弬鏁板悕縐扮殑闂銆?/STRONG>
涓轟簡涓嶴OAP絳夊熀浜嶺ML鐨勫崗璁吋瀹癸紝蹇呴』寮濮嬪氨鎶婂弬鏁板悕縐拌冭檻鍦ㄥ唴銆?BR>
浠g爜緇忚繃C錛嬶紜緙栬瘧鍣ㄧ紪璇戜互鍚庯紝綾誨瀷銆佸彉閲忓悕縐扮瓑閮戒笉澶嶅瓨鍦紝鍞竴鐣欎笅鐨勬槸RTTI錛屾樉鐒朵笉鑳借В鍐寵繖涓棶棰樸傛墍浠ュ彧鑳藉湪瀹氫箟鏃舵妸瀹冨姞鍏ャ?BR>
METHOD (void(in<int>, inout<string>, out<short>), method1, index, info, result);
END_SERVICE()
濡傛灉浣跨敤榪欑鏂瑰紡錛宨ndex, info, result鍒嗗埆琛ㄧず鍙橀噺鍚嶅瓧錛屽湪瀹忛噷闈㈣漿鎴愬瓧絎︿覆錛岀湅璧鋒潵濂藉儚涓嶅お鑸掓湇錛岃屼笖瀹忎笉鏀寔鍙傛暟涓暟鍙樺寲銆?BR>
METHOD (void(in<int>, inout<string>, out<short>), method1, "(index, info, result)");
METHOD (int(in<int>, inout<string>), method2, "result(index, info)");
END_SERVICE()
榪欑鍙兘紼嶇◢鑸掓湇涓鐐癸紝鍦∕ethod鏋勯犲嚱鏁版垨鍏跺畠鍦版柟瑙f瀽榪欎釜瀛楃涓詫紝璧嬬粰鍚勪釜鍙傛暟銆備笉榪囧畠鐨勭己鐐規槸鎶婄紪璇戞湡搴旇媯鏌ュ嚭鏉ョ殑閿欒錛屽歡榪熷埌榪愯鏈熴傚鏋滃湪緙栬瘧鏈熸潵鍋氾紝鍙堜細浣挎帴鍙f弿榪板彉寰楀緢澶嶆潅銆?BR>
鍙槸涓轟簡寰楀埌鍙傛暟鐨勫悕瀛楋紝灝辮澧炲姞榪欎箞浜涢夯鐑︺?BR>
c++0x鍙槸涓涓簱鐨勬爣鍑嗭紝浼拌XTI涔熶笉浼氬姞鍏ヨ繖浜涚壒鎬э紝鑰屼笖c++0x寰堥仴榪滐紝鎵浠ユ殏鏃朵互榪欑鏂瑰紡鏉ュ仛銆?BR>
鏆傛椂鐨勮В鍐沖姙娉曪細
METHOD (void(in<int>, inout<string>, out<short>), method1);
METHOD (int(in<int>, inout<string>), method2);
BEGIN_SERVICE_DEFINE(TestService)
METHOD_DEFINE (method1, "(index, info, result)", test_func);
METHOD_DEFINE (method2, "result(index, info)", &Test::test_method);
END_SERVICE_DEFINE()
END_SERVICE()
緙虹偣鏄弬鏁板悕縐頒腑鐨勯敊璇紝瑕佸歡榪熷埌榪愯鏈熸墠鑳借В鍐蟲帀銆?BR>
2銆佹湇鍔″璞$殑澶у皬銆?BR>
濡傛灉瀹㈡埛绔璋冪敤鍏朵腑涓涓柟娉曪紝鐢熸垚涓涓猅estService錛屽垯鏋勯犳垚鏈お楂橈紝鐗瑰埆鏄竴涓湇鍔′腑鏈夊涓柟娉曠殑鏃跺欍備竴涓湇鍔″綰充簡澶氫釜鏂規硶錛岃屾瘡涓柟娉曞寘鍚竴涓獀ector錛屼互鍙婂悇涓弬鏁幫紝榪欒繕娌¤冭檻浠ュ悗鐨勬墿灞曘?BR>
鎵浠ュ簲璇ヤ慨鏀硅皟鐢ㄦ柟寮忥紝璁╁畠鍙彧闇瑕佺敓鎴愯皟鐢ㄦ墍闇鐨勬渶灝忥紙灝戯級瀵硅薄銆?BR>
榪欓儴鍒嗚冭檻榪樹笉鎴愮啛錛屾殏鏃跺彲浠ヤ笉綆″畠錛岃屼互鏂規硶浣滀負鑰冭檻鐨勫璞°?BR>
鏆傛椂鎯沖埌鐨勮В鍐沖姙娉曪細
Method瀵硅薄涓殑parameters瀹瑰櫒鍜屽悇涓弬鏁幫紝鍙湪璋冪敤operator ()鎴朼sync_call鏃訛紝鎵嶇湡姝g敓鎴愬嚭鏉ャ?BR>
榪欐牱鐨勮瘽錛孧ethod瀵硅薄涓粎淇濆瓨涓涓┖鐨剉ector銆?BR>
鐢氳嚦榪欎釜vector涔熷彲浠ュ彧鏄竴涓┖鎸囬拡錛屽綋璋冪敤閭e嚑涓嚱鏁版椂錛屾墠鐢熸垚涓涓?BR>
鏆傛椂鎶婅繖涓繃紼嬪懡鍚嶄負Create On Call(COC)銆?BR>
COC鐨勫ソ澶勬槸鏄捐屾槗瑙佺殑錛屾瘡涓璞″皢鍙湁8瀛楄妭錛岃櫄琛ㄦ寚閽堬紜鏁版嵁瀵硅薄鐨勬寚閽堬紝鈥滄暟鎹璞♀濇槸瀹為檯璋冪敤鏃舵墠鐢熸垚鐨勫璞★紝鍖呮嫭鍙傛暟vector瀹瑰櫒銆佸洖璋冨嚱鏁版寚閽堬紙鍙兘鐢卞姩鎬佺敓鎴愪竴涓鎵樺璞★紝浠ラ傚簲騫挎硾綾誨瀷鐨勫洖璋冨嚱鏁幫級銆佸璞¢攣錛堥槻姝㈠共鎵板埌鍓嶄竴涓皟鐢級銆傚垵濮嬪寲鎴愭湰鎺ヨ繎0錛堣櫄鍑芥暟琛ㄧ殑鍒濆鍖栧拷鐣ヤ笉璁★級銆?BR>
褰撹皟鐢╫perator()鎴朼sync_call鏃訛紙浠ヤ笅綆縐癈ALL錛夛紝灝嗚皟鐢╟reate_parameters铏氬嚱鏁幫紝鍔ㄦ佺敓鎴愪竴涓獀ector銆傝繖鏍鳳紝娌℃湁璋冪敤鍒扮殑Method涓嶄細璞″師鏉ヤ竴鏍峰獎鍝嶅埌鏈嶅姟瀵硅薄鐨勬瀯寤烘ц兘銆?BR>
榪欏氨瑕佹眰鎶奙ethod鐨勨滃厓鈥濅俊鎭彁鍒板叏灞錛屽綋鐒舵洿絎﹀悎鈥滃厓鈥濈殑鏈剰錛屽師鏉ョ敱鏈嶅姟瀵硅薄鏌ヨMethod浠ヨ幏寰椻滃厓鈥濅俊鎭殑榪囩▼錛岀幇鍦ㄧ湅鏉ヤ篃鏄笉鍚堢悊鐨勩?BR>
3銆乮n妯℃澘鍙互鐪佺暐銆?/STRONG>
in鏄粯璁ょ殑鍙傛暟綾誨瀷錛岃繑鍥炲煎垯榛樿涓簅ut綾誨瀷錛岃繖閮芥槸涓嶉渶瑕佹槑紜寚瀹氱殑銆?BR>
瑙e喅鍔炴硶錛?BR>
榪欎釜闂鏄瘮杈冨ソ瑙e喅鐨勶紝鍦↖nOutTypeTraits妯℃澘綾諱腑錛屼負鍚勪釜鍋忕壒鍖栫増鏈畾涔変竴涓猼ype綾誨瀷錛孖nOutTypeTraits錛淭錛?:type鐨勭被鍨嬩負in錛淭錛烇紝InOutTypes錛渋n錛淭錛烇紴::type鐨勭被鍨嬩負in錛淭錛烇紝InOutTypes錛渋nout錛淭錛烇紴::type鐨勭被鍨嬩負inout錛淭錛烇紝InOutTypes錛渙ut錛淭錛烇紴::type鐨勭被鍨嬩負out錛淭錛烇紝InList妯℃澘綾諱腑榪涜榪欑杞崲銆?BR>
4銆佸紓姝ヨ皟鐢ㄩ槦鍒椼?/STRONG>
鍦ㄧ2鐐逛腑浠嬬粛閬擄細
姣忎釜瀵硅薄灝嗗彧鏈?瀛楄妭錛岃櫄琛ㄦ寚閽堬紜鏁版嵁瀵硅薄鐨勬寚閽堬紝鈥滄暟鎹璞♀濇槸瀹為檯璋冪敤鏃舵墠鐢熸垚鐨勫璞★紝鍖呮嫭鍙傛暟vector瀹瑰櫒銆佸洖璋冨嚱鏁版寚閽堬紙鍙兘鐢卞姩鎬佺敓鎴愪竴涓鎵樺璞★紝浠ラ傚簲騫挎硾綾誨瀷鐨勫洖璋冨嚱鏁幫級銆佸璞¢攣錛堥槻姝㈠共鎵板埌鍓嶄竴涓皟鐢級銆傚垵濮嬪寲鎴愭湰鎺ヨ繎0錛堣櫄鍑芥暟琛ㄧ殑鍒濆鍖栧拷鐣ヤ笉璁★級銆?BR>
鎻愬埌浜嗗璞¢攣錛岃繖鏄竴縐嶄綆鏁堢殑鍋氭硶錛屽彲浠ヤ嬌鐢ㄥ紓姝ヨ皟鐢ㄩ槦鍒楁潵鏇夸唬瀹冦?BR>
瑙e喅鍔炴硶錛?/STRONG>
褰撳紑濮嬩竴涓皟鐢ㄦ椂錛屼復鏃剁敓鎴愪笂闈㈡墍璇寸殑鈥滄暟鎹璞♀濓紝浜ょ敱涓涓皟鐢ㄩ槦鍒楀幓瀹屾垚銆傝繖鏃訛紝鐢變簬Method瀵硅薄鍩烘湰涓嶇鐞嗘暟鎹紝鎵浠ュ畠鎴愪簡涓涓┖澹籌紝浣滅敤鏄繚瀛樼被鍨嬩俊鎭?BR>
寮傛璋冪敤鏈濂界殑瀹炵幇灝辨槸鏁翠釜緋葷粺閮界敱寮傛璋冪敤鏋勬垚錛岃屽悓姝ヨ皟鐢ㄦ槸鐢卞紓姝ヨ皟鐢ㄦā鎷熻屾垚銆傚師鏈墦綆楃粫榪囪繖縐嶆柟寮忥紝鐢ㄦ渶綆鍗曠殑鏂規硶鏉ュ仛錛岀幇鍦ㄥソ鍍忓張緇曞洖鏉ヤ簡銆?BR>
涓婇潰榪欎釜鍋氭硶錛屽緢濂藉湴鎶婂厓淇℃伅鍜岀湡瀹炴暟鎹垎寮浜嗭紝鎵浠ユ墦綆楁敼鎴愯繖縐嶇粨鏋勩?BR>
5銆佸叏灞鍏冧俊鎭?BR>
閫氳繃絎?鏉$殑鐮旂┒錛屽凡緇忎嬌寰桵ethod瀵硅薄鎴愪負涓涓┖澹籌紝鑰屸滄暟鎹璞♀濆湪娌℃湁璋冪敤鏃跺張涓嶇敓鎴愶紝浣垮緱鑷渷緇撴瀯蹇呴』閲嶆柊鍋氥?BR>
鑰冨療浜唈ava絳夎璦鐨勮嚜鐪侊紝涔熸墦綆楁妸鍏冧俊鎭殑浣嶇疆鎻愬崌鍒板叏灞錛岃屾瘡涓狹ethod瀵硅薄灝嗗彧淇濈暀涓涓叏灞鍏冧俊鎭殑鎸囬拡錛岃繖鏍峰簲璇ユ洿鑷劧銆?BR>
錛堜互鍚庨亣鍒扮殑闂鍙洿鏂板埌榪欎釜鏂囨。涓級
]]>
async_call鍑芥暟鐨勫師鍨嬫槸錛?BR>
void async_call (int v0, char v1, string v2, FUNC_TYPE func);
榪欐槸妯℃澘綾繪牴鎹甶n/out鏉ヤ駭鐢熺殑銆?BR>
鍦ㄥ紓姝ヨ皟鐢ㄤ腑錛屽弬鏁版槸鍜屾搷浣滀繚瀛樺湪涓璧風殑錛屽洜涓鴻浜ょ粰綰跨▼澶勭悊銆傚墠闈㈠凡緇忚榪囷紝Method妯℃澘綾諱腑灝嗕繚鏈夎繖浜涘弬鏁幫紝Method鐨勫畾涔夊涓嬶紙浠ヤ緥瀛愪腑4涓弬鏁扮殑鐗瑰寲鐗堟湰鏉ヨ鏄庯級錛?BR>
struct Method <void(A,B,C,D)> : public Base < typename Loki::TL::MakeTypelist< A,B,C,D >::Result >
{
A a;
B b;
C c;
D d;
Method ()
{
parameters.push_back (&a);
parameters.push_back (&b);
parameters.push_back (&c);
parameters.push_back (&d);
}
};
鐩稿簲鍦幫紝Base綾諱嬌鐢ㄨ繖涓壒鍖栫増鏈細
struct Base <TYPES, IN_TYPES, 3> : public IMethod
{
typedef typename FuncTypeTraits <TYPES>::Result FUNC_TYPE;
void async_call (
typename Loki::TL::TypeAt <IN_TYPES, 0>::Result::OriginalType v0,
typename Loki::TL::TypeAt <IN_TYPES, 1>::Result::OriginalType v1,
typename Loki::TL::TypeAt <IN_TYPES, 2>::Result::OriginalType v2,
FUNC_TYPE func = 0)
{
}
};
TYPES妯℃澘鍙傛暟涓繚瀛樹簡鎵鏈夌殑鍙傛暟綾誨瀷錛孖N_TYPES妯℃澘鍙傛暟涓繚瀛樹簡鎵鏈夌殑in鍙傛暟綾誨瀷錛屼絾瀹冧滑涓嶇煡閬撳浣曟潵瀵瑰簲璧鋒潵錛宎sync_call涔熶笉鐭ラ亾濡備綍鎶婂嚑涓弬鏁板間氦緇檖arameters錛堝湪IMethod涓畾涔夛紝瑙佷笂涓綃囷級銆?BR>
濡傛灉鎴戜滑鍦ㄧ敓鎴怚N_TYPES鐨勬椂鍊欙紝鎶婂畠鍦═YPES涓殑浣嶇疆錛堢儲寮曪級涔熶竴璧蜂氦緇欏畠錛屽氨鑳借В鍐寵繖涓棶棰樸?BR>
InList絎簩涓ā鏉垮弬鏁版槸涓涓父閲忥紝褰撴垜浠妸TYPES浜ょ粰瀹冩椂錛屼互涓婇潰鐨勪唬鐮佷負渚嬶紝灝嗕細浣跨敤T_COUNT鍊間負4鐨勫亸鐗瑰寲鐗堟湰銆傝繖鏃跺欙紝灝嗕細棣栧厛鎺ㄥ鍑篒N_TYPES涓殑絎竴涓被鍨媔nt錛屽畠鍦↖N_TYPES涓殑绱㈠紩鏄?錛屽茍鎺ョ潃璋冪敤T_COUNT鍊兼槸3鐨勫亸鐗瑰寲鐗堟湰錛岃繖鏍烽掑綊鎺ㄥ錛岀洿鍒拌皟鐢═_COUNT鍊間負0鐨勫亸鐗瑰寲鐗堟湰錛岃繖涓繃紼嬪氨緇撴潫浜嗐傚湪榪欎釜閫掑綊榪囩▼涓紝鑳藉寰楀埌鍚勪釜綾誨瀷浠ュ強瀵瑰簲鐨勨滅儲寮曗濆鹼細int: 4, char: 3, string: 2銆?BR>
娉ㄦ剰榪欎釜绱㈠紩鍊煎拰瀹為檯鐨勭儲寮曞兼槸鏈夊樊鍒殑錛屽疄闄呯殑绱㈠紩鍊煎簲璇ユ槸4-T_COUNT錛屾墍浠ヤ笂闈㈢殑瀵瑰簲鍏崇郴搴旇鏄細int: 0, char: 1, string: 2銆?BR>
鏈鍒濅紶閫掔粰InList鐨凾YPES鏈?涓厓绱狅紝褰撳畠閫掑綊璋冪敤鏃訛紝榪欎釜鍊煎氨浼氫緷嬈¢掑噺錛屽悗闈㈢殑閫掑綊璋冪敤騫朵笉鐭ラ亾搴旇鐢?鍘誨噺鎺塗_COUNT浣滀負绱㈠紩錛屽洜涓?騫舵病鏈変紶閫掕繃鏉ャ傜畝鍗曠殑瑙e喅鍔炴硶鏄啀鍔犱笂涓涓ā鏉垮弬鏁幫紝璁╁畠寰涓嬩紶閫掞紝褰撶劧榪欑鏂瑰紡騫朵笉濂界湅錛屽ソ鍦ㄦ垜浠笉鏄湡鐨勫繀欏昏繖涔堝仛銆?BR>
娉ㄦ剰錛屽湪Base綾諱腑錛屽畠鏄煡閬揟YPES鐨勪釜鏁扮殑錛岄偅涔堝彧瑕佺敤榪欎釜鏁板噺鍘誨墠闈㈢敓鎴愮殑IN_TYPE鐨勨滅儲寮曗濓紝灝辮兘寰楀埌榪欎釜綾誨瀷鍦═YPES涓殑鐪熸绱㈠紩銆傦紙榪欓儴鍒嗙湡鏄湁鐐圭綏鍡︼級
淇敼InList妯℃澘綾伙紝璁╁畠鐢熸垚鐢?FONT style="BACKGROUND-COLOR: #a9a9a9" color=#a9a9a9> [ in綾誨瀷浠ュ強in綾誨瀷鍦═YPES涓殑鈥滅儲寮曗漖 鏋勬垚鐨勬柊Typelist銆?BR>
棣栧厛瑕佸鍔犱竴涓緟鍔╂ā鏉跨被錛?BR>
struct TypeReversedIndex
{
typedef T type;
enum {value = INDEX};
};
瀹冭兘澶熶繚瀛樹竴涓被鍨嬶紝浠ュ強涓涓暣鏁般傚彇鍚嶄負TypeReversedIndex錛屾剰鎬濇槸璇村畠瑕佷繚瀛樹竴涓猅ype鍜屼竴涓猂eversedIndex錛堝弽鐨勭儲寮曪級銆?BR>
InList妯℃澘綾諱篃瑕佷慨鏀癸紝OutList渚濇棫鏄厤璐硅禒閫侊細
struct InList
{
typedef typename If <
InOutTypeTraits <typename T::Head>::isin,
typename Loki::Typelist < TypeReversedIndex <typename T::Head, T_COUNT>, typename InList <typename T::Tail>::Result >,
typename InList <typename T::Tail>::Result
>::Result Result;
};
template <class T>
struct InList < T, 0 >
{
typedef typename Loki::TL::MakeTypelist <>::Result Result;
};
template < class T, int T_COUNT = Loki::TL::Length <T>::value >
struct OutList
{
typedef typename If <
InOutTypeTraits <typename T::Head>::isout,
typename Loki::Typelist < TypeReversedIndex <typename T::Head, T_COUNT>, typename OutList <typename T::Tail>::Result >,
typename OutList <typename T::Tail>::Result
>::Result Result;
};
template <class T>
struct OutList < T, 0 >
{
typedef typename Loki::TL::MakeTypelist <>::Result Result;
};
Base綾誨氨鍙互鍐欏嚭鏉ヤ簡錛?BR>
struct Base <TYPES, IN_TYPES, 3> : public IMethod
{
typedef typename FuncTypeTraits <TYPES>::Result FUNC_TYPE;
typedef IN_TYPES type;
enum {TYPES_COUNT = typename Loki::TL::Length<TYPES>::value};
void async_call (
typename Loki::TL::TypeAt <IN_TYPES, 0>::Result::type::OriginalType v0,
typename Loki::TL::TypeAt <IN_TYPES, 1>::Result::type::OriginalType v1,
typename Loki::TL::TypeAt <IN_TYPES, 2>::Result::type::OriginalType v2,
FUNC_TYPE func = 0)
{
((typename Loki::TL::TypeAt <IN_TYPES, 0>::Result::type*)
parameters[TYPES_COUNT - typename Loki::TL::TypeAt <IN_TYPES, 0>::Result::value])->setValue (v0);
((typename Loki::TL::TypeAt <IN_TYPES, 1>::Result::type*)
parameters[TYPES_COUNT - typename Loki::TL::TypeAt <IN_TYPES, 1>::Result::value])->setValue (v1);
((typename Loki::TL::TypeAt <IN_TYPES, 2>::Result::type*)
parameters[TYPES_COUNT - typename Loki::TL::TypeAt <IN_TYPES, 2>::Result::value])->setValue (v2);
}
};
parameters涓瓨鏀劇殑鏄疘Parameter*綾誨瀷錛岃繖閲屼嬌鐢ㄤ簡寮哄埗杞瀷錛屽茍璋冪敤in/inout妯℃澘綾葷殑setValue鏂規硶緇欏畠璧嬪箋?BR>
涓轟簡嫻嬭瘯緇撴灉錛屾垜涓篒Parameter鍔犱笂浜唙oid print () const铏氬嚱鏁幫紝騫跺湪in/inout/out妯℃澘綾諱腑瀹炵幇瀹冿紝鎵撳嵃鍑虹被鍨嬶紝in/inout綾諱腑榪樺皢鎵撳嵃鍑哄弬鏁板箋?BR>
{
public:
virtual void print () const = 0;
};
struct in : public IParameter
{
typedef T OriginalType;
T value;
void setValue (T v){
value = v;
}
void print () const {
cout << typeid(*this).name() << ": " << value << endl;
}
};
template <class T>
struct out : public IParameter
{
typedef T OriginalType;
virtual void print () const {
cout << typeid(*this).name() << endl;
}
};
template <class T>
struct inout : public IParameter
{
typedef T OriginalType;
T value;
void setValue (T v){
value = v;
}
virtual void print () const {
cout << typeid(*this).name() << ": " << value << endl;
}
};
騫跺湪Base::async_call涓皟鐢╬arameters涓墍鏈夊璞$殑print鍑芥暟鏉ヨ緭鍑轟竴浜涜皟璇曚俊鎭細
parameters[i]->print ();
綆鍗曟祴璇曚簡2縐嶇被鍨嬶紝涓嶈兘淇濊瘉鎵鏈変唬鐮侀兘鏄紜殑錛屾瘯绔熸槸鎵嬪伐鍐欏嚭鏉ョ殑涔熸病緇忚繃媯鏌ワ紝妯℃澘綾誨湪娌℃湁瀹炰緥鍖栫殑鏃跺欐煇浜涢敊璇槸涓嶄細鎶ュ憡鐨勩?BR>
嫻嬭瘯浠g爜濡備笅錛?BR>
{
cout << "===========================================" << endl;
cout << "test_func(" << v0 << ", " << v1 << ", " << v2 << ", " << v3 << ")" << endl;
}
void test_func1 (int v0, char v1, short v2, string v3)
{
cout << "===========================================" << endl;
cout << "test_func1(" << v0 << ", " << v1 << ", " << v2 << ", " << v3 << ")" << endl;
}
int main()
{
{
Method < void(in<int>, in<char>, inout<string>, out<short>) > m;
m.async_call(3, 'a', "test");
cout << "===========================================" << endl;
m.async_call(3, 'a', "test", test_func);
cout << "===========================================" << endl;
}
{
Method <string(in<int>, out<char>, inout<short>)> m;
m.async_call(3, 4);
cout << "===========================================" << endl;
m.async_call(3, 4, test_func1);
cout << "===========================================" << endl;
}
return 0;
}
鍏ㄩ儴浠g爜澶暱錛屽氨涓嶄竴涓緗楀垪浜庢浜嗭紝鍙互鐐瑰嚮榪欓噷涓嬭澆銆?BR>
]]>
]]>
鍓?綃囦貢涓冨叓緋熷湴璁蹭簡涓浜涳紝鏈変竴涓仐鐣欓棶棰橈紝鍑芥暟鍘熷瀷鐨勬帹瀵箋?BR>
綆瑕佹弿榪板涓嬶細
瑕佷駭鐢熻繖3縐嶅嚱鏁板艦寮忋傚弬鏁扮被鍨嬪浣曡漿鎹紝鏄互鍚庣殑璇濋錛屾湰綃囦富瑕佽В鍐沖紓姝ヨ皟鐢ㄧ殑鍑芥暟鍘熷艦鎺ㄥ闂銆傛湰綃囦篃涓嶈璁篗ethod鐨勬ā鏉垮弬鏁幫紙鍗抽偅涓嚱鏁扮被鍨嬶級榪斿洖綾誨瀷涓嶄負void鐨勬儏鍐點?BR>
絎竴縐嶅艦寮忥紝鍚屾璋冪敤錛屾瘮杈冨ソ澶勭悊錛屽弬鏁頒釜鏁板拰妯℃澘鍙傛暟鐨勬暟閲忕浉鍚屻?BR>
鍚?縐嶅艦寮忥紝濡備綍璁╃紪璇戝櫒鏍規嵁in/out鏉ユ帹瀵煎嚭鍑芥暟鍘熷瀷錛?BR>
鎴戜滑闇瑕佺紪璇戝櫒鍋氳繖鏍風殑澶勭悊錛宎sync_call鐨勫弬鏁扮被鍨嬩腑錛宨n綾誨瀷鐨勫弬鏁板皢淇濈暀錛宱ut綾誨瀷鐨勫弬鏁頒笉闇瑕侊紝inout綾誨瀷涔熼渶瑕佷繚鐣欍?BR>
瑕佺敤鍒扮殑Loki澶存枃浠訛細
棣栧厛鐪嬬湅in/inout/out鐨勫0鏄庛備負浜嗙畝鍖栵紝榪欓噷鍘繪帀浜嗚窡綾誨瀷鎺ㄥ鏃犲叧鐨勯儴鍒嗐?/P>
鏍規嵁涓婇潰Method鐨勫畾涔夛紝Method < void(in
涔熷氨鏄錛屽彧瑕佹垜浠兘浣跨敤闈欐佹帹瀵兼柟寮忥紝鑾峰緱A,B,C,D榪欏洓涓弬鏁頒腑鎵鏈夌殑in綾誨瀷錛屾妸瀹冧氦緇橞ase浣滀負妯℃澘鍙傛暟灝辨垚浜嗐?/P>
榪欓噷闇瑕佷竴涓緟鍔╃殑妯℃澘綾伙紝鐢ㄦ潵鍦ㄧ紪璇戞椂甯姪鎺ㄥ錛?BR> 榪欎釜緋誨垪鐨勫悕瀛楀彨鈥滀負C++瀹炵幇涓涓狪DL鈥濓紝瀹為檯涓婂簲璇ュ彨鈥滀負C++瀹炵幇涓涓猂emoting鈥濆彲鑳芥洿濂戒竴浜涳紝璇存槸IDL錛屼富瑕佹槸鎯抽氳繃瀹忥紝浣跨敤綆鍗曠殑綾誨瀷瀹氫箟杈懼埌鑷姩鐢熸垚璋冪敤浠g爜鐨勭洰鐨勩?/P>
涓銆侀鍏堟潵鐪嬬湅璋冪敤涔犳儻銆?/STRONG> 浠庤皟鐢ㄤ範鎯叆鎵嬶紝涓昏鏄洜涓虹湅鍒扮洰鍓嶆湁寰堝搴?宸ュ叿鍖呭湪璋冪敤涓婇兘鏈夊緢澶氫笉渚夸箣澶勩傚亣濡傝兘鍦ㄤ竴寮濮嬪氨浠庤繖鐐瑰嚭鍙戯紝灝辮兘鎶婅皟鐢ㄦ帴鍙h璁″緱鏇村ソ涓浜涖?/P>
鍏堟潵鐪嬬湅鏈嶅姟绔浣曞紑鏀句竴涓湇鍔°?/P>
2銆伮犳湇鍔¢獙璇佹柟寮忥細 鐪嬭搗鏉ユ尯澶氱殑錛屽叾瀹炲緢闅炬帴瑙﹀埌榪欎簺錛屽彧闇瑕佷嬌鐢ㄥ畯鏉ュ畾涔変竴涓湇鍔★紝灝卞彲浠ラ氳繃妯℃澘鐨勭被鍨嬫帹瀵鹼紝鑷姩鐢熸垚榪欎簺澶嶆潅鐨勫畾涔夈?/P>涓夈佽皟鐢ㄨ繃紼嬨?BR> 聽 鍥涖佸紓姝ヨ皟鐢?寮傛鍒嗘淳(AMI/AMD)銆?BR> AMI鍜孉MD瀵逛簬闈欐佸畾涔夌殑鏈嶅姟鏄湁褰卞搷鐨勶紝姣斿涓嬮潰涓涓湇鍔★細 浜斻佸叾瀹冦?BR>
娉ㄦ剰錛岃繖閲屾槸浠ethod < void(in
class InOutTypeTraits
{
Loki::CompileTimeError <false> Not_Supported_Type;
};
template <class T>
struct InOutTypeTraits < in<T> >
{
enum {isin=1, isout=0};
};
template <class T>
struct InOutTypeTraits < out<T> >
{
enum {isin=0, isout=1};
};
template <class T>
struct InOutTypeTraits < inout<T> >
{
enum {isin=1, isout=1};
};
template <>
struct InOutTypeTraits < NullType >
{
enum {isin=0, isout=0};
};
閫氳繃鍙︿竴涓ā鏉跨被InList鏉ュ府鎴戜滑浜х敓鎵鏈夌殑in綾誨瀷錛屽畠鐨勭粨鏋滄槸涓涓猅ypelist銆備負浜嗘柟渚夸互鍚庝嬌鐢紝鎴戞妸out綾誨瀷浜х敓鍣ㄤ篃鍋氫簡涓涓狾utList銆?BR>
struct If
{
typedef _IF Result;
};
template <class _IF, class _ELSE>
struct If <0, _IF, _ELSE>
{
typedef _ELSE Result;
};
template <class A = NullType, class B = NullType, class C = NullType, class D = NullType,
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct InList
{
typedef typename If <
InOutTypeTraits <A>::isin,
typename Typelist < A, typename InList<B,C,D,E,F,G>::Result >,
typename InList<B,C,D,E,F,G,H>::Result
>::Result Result;
};
template <class A>
struct InList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
typedef typename If <
InOutTypeTraits <A>::isin,
typename MakeTypelist <A>::Result,
typename MakeTypelist <>::Result
>::Result Result;
};
template <class A = NullType, class B = NullType, class C = NullType, class D = NullType,
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct OutList
{
typedef typename If <
InOutTypeTraits<A>::isout,
typename Typelist < A, typename OutList<B,C,D,E,F,G>::Result >,
typename OutList<B,C,D,E,F,G,H>::Result
>::Result Result;
};
template <class A>
struct OutList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
typedef typename MakeTypelist <A>::Result Result;
};
瀹冪殑鍘熺悊鏄紝鏍規嵁If妯℃澘綾繪潵鍒ゆ柇涓涓被鍨嬫槸涓嶆槸in綾誨瀷錛屾槸鐨勮瘽灝辨妸瀹冨姞鍏ュ埌Typelist涓紝涓嶆槸灝辨帓闄ゅ畠銆?BR>
InList
鐜板湪Base妯℃澘綾誨皢鎺ュ彈涓涓ā鏉垮弬鏁幫紝瀹冩槸涓涓猅ypelist綾誨瀷錛岃繖涓笉璇︾粏璁蹭簡錛屾妸瀹冪殑瀹氫箟鍐欏嚭鏉ワ細
struct Base
{
Loki::CompileTimeError <false> Only_Use_Partial_Specialisation_Version;
};
template <class T>
struct Base <T, 0>
{
typedef void(*FUNC_TYPE)();
template <class FUNC_TYPE>
void async_call (FUNC_TYPE func)
{
}
void async_call ()
{
}
};
template <class T>
struct Base <T, 1>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
FUNC_TYPE func)
{
}
void async_call (typename TypeAt <T, 0>::Result::OriginalType v0)
{
}
};
template <class T>
struct Base <T, 2>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1)
{
}
};
template <class T>
struct Base <T, 3>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType,
typename TypeAt <T, 2>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2)
{
}
};
template <class T>
struct Base <T, 4>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType,
typename TypeAt <T, 2>::Result::OriginalType,
typename TypeAt <T, 3>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
typename TypeAt <T, 3>::Result::OriginalType v3,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
typename TypeAt <T, 3>::Result::OriginalType v3)
{
}
};
榪欓儴鍒嗘湁鐐瑰錛屽叾瀹炶繕鏄瘮杈冩竻鏅扮殑銆傛敞鎰忚繖涓狟ase鐨勭増鏈凡緇忎笉鏄笂闈㈡墍璁茬殑閭d釜浜嗐?BR>
鍑芥暟鍘熷艦鎺ㄥ闂灝辮瀹屼簡銆備笂闈㈢殑浠g爜涓嶄竴瀹氳繕鑳界紪璇戯紝鏄ㄥぉ鏄兘緙栬瘧鐨勶紝琚垜淇敼浜嗕竴浜涳紝涓轟簡瑙i噴錛屽張鏀規垚鏄ㄥぉ閭f牱瀛愩?img src ="http://m.shnenglu.com/cpunion/aggbug/349.html" width = "1" height = "1" />
]]>
{
聽聽聽聽//聽鍙戝竷涓篠OAP鏈嶅姟錛屽厛鐢熸垚涓涓湇鍔″鍣ㄣ?BR>聽聽聽聽//聽鏈嶅姟灝嗗彂甯冨湪localhost鐨?911涓婏紝localhost鐢ㄦ潵緇戝畾loopback緗戝崱銆?/SPAN>
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽TestService聽test_service;聽
聽聽聽聽soap_service.addService聽聽(鈥渢est_service鈥?聽&test_service);
聽聽聽聽TestService聽service1;
聽聽聽聽soap_service.addService聽(鈥淗elloService鈥?聽&service1);
聽聽聽聽try{
聽聽聽聽聽聽聽聽soap_service.run聽();
聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽{
聽聽聽聽}聽catch聽(SignalException&聽e)
聽聽聽聽{
聽聽聽聽}
聽聽聽聽return聽0;
}
鎴戝笇鏈涘氨鏄繖涔堢畝鍗曪紝瀹㈡埛绔皟鐢ㄦ湁澶氱鏂瑰紡錛?BR>1銆伮犱嬌鐢ㄦ湇鍔$殑IDL瀹氫箟錛岀洿鎺ヨ皟鐢細
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽try{
聽聽聽聽聽聽聽聽TestService聽test_service聽(鈥渢est_service鈥?聽&soap_service);
聽聽聽聽聽聽聽聽test_service.method1聽(/*
*/);
聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽{
聽聽聽聽}
聽聽聽聽return聽0;
}
榪欑鏂瑰紡姣旇緝綆鍗曪紝璋冪敤鏃朵細媯鏌ユ槸鍚﹀凡緇忚繛鎺ワ紝鐒跺悗鍙戦佽皟鐢ㄨ姹傦紝騫跺鐞嗚皟鐢ㄧ粨鏋溿?/P>
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽TestService聽test_service;
聽聽聽聽soap_service.getService聽(鈥渢est_service鈥?聽&test_service);
聽聽聽聽if聽(test_service)
聽聽聽聽{
聽聽聽聽聽聽聽聽try{
聽聽聽聽聽聽聽聽聽聽聽聽test_service.method1聽(/*
*/);
聽聽聽聽聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽return聽0;
}
3銆伮犳湇鍔″彂鐜版柟寮忥細
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽vector聽<string>聽services_name聽=聽soap_service.getServiceNames聽();
聽聽聽聽//聽
聽聽聽聽IService*聽test_service聽=聽soap_service.getService聽(鈥渢est_service鈥?;
聽聽聽聽if聽(test_service)
聽聽聽聽{
聽聽聽聽聽聽聽聽vector聽<string>聽methods聽=聽test_service->getMethodNames聽();
聽聽聽聽聽聽聽聽IMethod*聽method聽=聽test_service->getMethod聽(鈥渕ethod1鈥?;
聽聽聽聽聽聽聽聽vector聽<Type*>聽types聽=聽method->getParameterType聽s()
聽聽聽聽聽聽聽聽method->addArg聽(3);
聽聽聽聽聽聽聽聽method->addArg聽(4);
聽聽聽聽聽聽聽聽//聽
聽聽聽聽聽聽聽聽method->invoke聽();
聽聽聽聽聽聽聽聽//聽
聽聽聽聽}
聽聽聽聽return聽0;
}
浜屻佸熀鏈渶姹傘?BR>
綆鍗曞垎鏋愪竴涓嬶紝涓婇潰涓鍏辨秹鍙婁簡鍝簺綾誨瀷錛?BR>IProxy:
榪欐槸鎵鏈塒roxy綾葷殑鍩虹被(鍜屾帴鍙?錛屽畠鍙互瀹圭撼澶氫釜鏈嶅姟瀵硅薄錛屾彁渚涙湇鍔$粦瀹氥佹湇鍔℃煡璇€佹湇鍔″彂鐜般佹湇鍔¢獙璇併?BR>IService:
鎵鏈塖ervice綾葷殑鍩虹被錛屽彲浠ュ綰沖涓柟娉?Method)錛屾彁渚涙柟娉曟煡璇€佹湇鍔¢獙璇併?BR>IMethod:
鎵鏈塎ethod妯℃澘綾葷殑鍩虹被錛屽綰沖涓弬鏁幫紝鍖呮嫭榪斿洖鍊鹼紝鍙氳繃鏌ヨ鍙傛暟綾誨瀷鑾峰緱鏂規硶鐨勭被鍨嬪畾涔夈?BR>IParameter:
鎵鏈夊弬鏁扮殑鍩虹被錛屽寘鍚竴涓弬鏁扮被鍨嬫弿榪板拰涓涓弬鏁板箋?BR>IType:
鎵鏈夌被鍨嬬殑鍩虹被錛岄瀹氫箟浜嗕竴浜涘熀鏈被鍨嬶紝鍙嚜瀹氫箟綾誨瀷銆?/P>
浠ヤ笅鍙畝鍗曞垎鏋愪竴涓嬪悓姝ヨ皟鐢紝寮傛璋冪敤灝嗘槸浠ュ悗鐨勬墿鍏呰瘽棰樸?BR>鏍規嵁絎簩鑺傜殑3縐嶄笉鍚岃皟鐢ㄨ繃紼嬶紝綆瑕佹弿榪板涓嬶細
榪欑鏂瑰紡鐪嬭搗鏉ュ浜嗕竴浜涙搷浣滐紝涓嶈繃楠岃瘉鐨勫ソ澶勬槸鑳藉鍑忓皯璋冪敤鏃剁殑寮傚父銆?
浣跨敤榪欑鏂瑰紡錛岃皟鐢ㄧ涓嶉渶瑕佹湇鍔$殑綾誨瀷瀹氫箟銆?
鍚屾璋冪敤鏃訛紝璋冪敤绔嚎紼嬮渶瑕佺瓑寰呰皟鐢ㄧ粨鏋滐紝鏈嶅姟绔嚎紼嬩篃瑕佺瓑寰呰皟鐢ㄧ粨鏉熻繑鍥烇紝鎵嶅鐞嗕笅涓涓皟鐢ㄣ?BR>涓轟簡鍦ㄦ湇鍔¤皟鐢ㄦ湡闂磋綰跨▼鑳藉仛鏇村鐨勪簨錛?BR>璋冪敤绔妸璋冪敤浜ょ粰綰跨▼姹犲畬鎴愶紝騫跺湪璋冪敤瀹屾垚鍚庨噰鐢ㄦ煇縐嶆満鍒墮氱煡綰跨▼澶勭悊緇撴灉錛屾垨鑰呯洿鎺ョ敱綰跨▼姹犱腑鐨勮皟鐢ㄧ嚎紼嬭皟鐢ㄧ粨鏋滃鐞嗗嚱鏁般傝繖縐嶆柟寮忕О涓篈MI(寮傛鏂規硶璋冪敤)銆?BR>鏈嶅姟绔富綰跨▼鍒欐妸鎺ユ敹鍒扮殑娑堟伅瑙f瀽鍚庯紝鏀懼叆澶勭悊闃熷垪錛岀敱綰跨▼姹犲幓澶勭悊璋冪敤榪囩▼銆傚綋璋冪敤瀹屾垚鍚庯紝緇撴灉鏀懼叆緇撴灉闃熷垪錛岀敱涓葷嚎紼嬪鐞嗘垚娑堟伅錛屽彂閫佸洖璋冪敤绔傝繖縐嶆柟寮忕О涓篈MD(寮傛鏂規硶鍒嗘淳)銆?BR>璋冪敤绔拰鏈嶅姟绔緷鏃ф槸浣跨敤閫氳鍗忚鏉ユ矡閫氾紝鍙屾柟閮戒笉鐭ラ亾瀵規柟鏄惁閲囩敤浜嗗紓姝ユ柟寮忋?/P>
{
聽聽聽聽Method聽<void(in<int>,聽out<int>)>聽method1;
}
鍦ㄥ悓姝ヨ皟鐢ㄦ椂錛屽畠鐨勮皟鐢ㄦ柟寮忥細
int聽a;
service.method1聽(3,聽a);聽//聽鎴栬吢爏ervice.method1聽(3,聽&a)錛屾墦綆楀吋瀹硅繖2縐嶆柟寮忋?/SPAN>
寮傛璋冪敤鏃訛紝璋冪敤鏂瑰紡錛?/P>
TestService聽test_service;
test_service.method1.async_call(3,聽method1_result);聽//聽璋冪敤瀹屾垚鍚庯紝璁╄皟鐢ㄧ嚎紼嬪幓璋冪敤method1_result閫氱煡璋冪敤緇撴灉銆?BR>//聽鎴栬呭儚涓嬮潰
IMethod*聽result聽=聽test_service.method1.async_call聽(3);
while聽(!result->done())聽聽//聽榪樻湁寰堝濂藉姙娉曪紝榪欓噷鍙槸涓轟簡綆鍗曘?/SPAN>
{
聽聽聽聽sleep聽(1);
}
cout聽<<聽result->getArg(1)->toInt();聽
姝e涓婇潰婕旂ず鐨勪竴鏍鳳紝寮傛璋冪敤鐨勭粨鏋滄湁2縐嶆柟寮忓幓澶勭悊銆?BR>涓鏄敱綰跨▼姹犺皟鐢ㄥ畬浠ュ悗錛屾帴鐫璋冪敤涓涓嚱鏁頒互閫氱煡緇撴灉銆傚畠涓嶉渶瑕佽疆璇紝涓嶈繃娑夊強鍒頒簡綰跨▼闂錛屽鍔犱簡涓浜涘鏉傛с?BR>鍙︿竴縐嶆柟寮忚皟鐢ㄧ粨鏉熷悗錛屽師璋冪敤綰跨▼鍦ㄦ煇涓傚綋鐨勨滄椂鏈衡濆幓鏌ヨ璋冪敤緇撴灉銆傝繖涓椂鏈哄彲浠ユ槸瀹氭椂鏌ヨ錛屼篃鍙互鏄綰跨▼娑堟伅閫氱煡鑰屽幓澶勭悊銆?/P>
榪欎竴綃囧姞涓婂墠涓綃囷紝搴旇鏄彁鍒頒簡鍏ㄩ儴鐨勮鐐廣?BR>鐩墠鍓╀笅鐨勫敮涓涓涓毦鐐癸紝鍙兘鏄湪澶勭悊寮傛璋冪敤鏃訛紝Method鐨勫畾涔夈?BR>姝e涓婇潰婕旂ず鐨勶紝涓涓柟娉曞湪鍚屾璋冪敤鍜屽紓姝ヨ皟鐢ㄦ椂錛屽氨鏈?縐嶈皟鐢ㄦ柟寮忥細
test_service.method1.async_call(3,聽method1_result);
IMethod*聽result聽=聽test_service.method1.async_call聽(3);
鐗瑰埆鍦幫紝瀹冨浣曟牴鎹甶n鍜屼釜鏁板拰out鐨勪釜鏁幫紝浜х敓閭?涓弬鏁頒釜鏁板尮閰嶇殑寮傛璋冪敤鍑芥暟錛?BR>鍐嶆潵鍥為【涓涓媘ethod1鐨勫畾涔夛細
鏄劇劧鏈変竴瀹氱殑澶嶆潅鎬э紝涓嶈繃鎴戣涓鴻繕鏄彲浠ュ鐞嗘帀鐨勩傛嬁3涓弬鏁扮殑鍋忕壒鍖栫増鏈潵璇存槑錛?/P>
class聽Method聽<Out<Ret>(A,B,C)>聽:聽public聽MethodBase聽<Out<Ret>,A,B,C>
{
};
template聽<class聽Ret=NullType,聽class聽A=NullType,聽class聽B=NullType,聽class聽C=NullType,聽class聽D=NullType,聽IN_COUNT=InCount<聽A,B,C,D>::value聽>
class聽MethodBase
{
};
閫氳繃瀵筂ethodBase綾葷殑IN錛緾OUNT鍙傛暟瀹氫箟鍋忕壒鍖栵紝鍗沖彲瀹氫箟鍑鴻繖浜涗笉鍚岀殑鐗堟湰銆?BR>
褰撶劧浠呬粎鏄煡閬撲簡IN鍙傛暟鐨勪釜鏁幫紝榪樻病鏈夋彁鍙栧嚭IN鍙傛暟鐨勭被鍨嬶紝鎵浠ヨ繕涓嶈兘鐢熸垚鍑芥暟鐨勫師鍨嬶紝鎴栬闇瑕佹妸typelist鍔犺繘鏉ヤ簡錛坙oki涓殑閭d釜錛夈?BR>
榪欐槸鍚庨潰瑕佽冭檻鐨勫唴瀹癸紝浠婂ぉ鍏堟兂鍒拌繖銆?/P>
榪欐鏃墮棿鑰冭檻瀹炵幇涓涓函C錛嬶紜鐨勫垎甯冨紡鏈嶅姟鍖呰搴擄紝綆瑕佹弿榪板涓嬶細
鏈夊涓嬬被鍜屽嚱鏁幫細
鎯蟲妸瀹冧滑浣滀負鏈嶅姟鍙戝竷鍑哄幓錛屼互SOAP鎴栧叾瀹冩柟寮忋傚彂甯冧負涓涓猅estService錛屽茍璁╁畠鎼哄甫澶氫竴浜涗俊鎭?
C錛嬶紜鏈夎澶氬伐鍏楓佸簱鏉ュ仛鍒拌繖鐐癸紝浣嗘槸錛岄兘闇瑕佺敓鎴愪竴鍫嗕唬鐮侊紝寰堟槸涓嶇埥銆?BR>
鍏跺畠璇█錛屾瘮濡俻ython, java, c#絳夛紝閮藉彲浠ラ氳繃鑷渷鏈哄埗錛屾姏寮IDL鍦ㄨ璦鍐呭疄鐜般?BR>
C錛嬶紜騫墮潪涓嶈兘鍋氳繖涓紝瀹冨彧鏄己灝戣凍澶熺殑綾誨瀷淇℃伅銆傛瘮濡備笂闈㈢殑渚嬪瓙錛屽鏋滆鍙戝竷涓烘湇鍔★紝閭d箞鑷沖皯搴旇鎶婂畠鐨勫弬鏁般佽繑鍥炲兼悶寰楁槑紜簺錛屽惁鍒欒涔堜細閫犳垚涓嶅繀瑕佺殑鍙傛暟浼犻掞紝瑕佷箞浼氫駭鐢熼敊璇紙鎶奜UT鍙傛暟鍙栧煎彲涓嶆槸瀹夊叏鐨勶級銆?BR>
姣斿涓婇潰鍑虹幇鐨刬nt, int&, int*錛屽湪浣滀負in鍙傛暟鏃訛紝鎴戜滑鏄兂浼犻掑畠鐨勫鹼紝綾誨瀷涓篿nt銆傝宨nt*鍜宻tring*浣滀負out鍙傛暟鏃訛紝鎴戜滑鎯寵瀹冧紶閫掓寚閽堟垨寮曠敤錛屽綋璋冪敤榪斿洖鏃訛紝鎴戜滑緇欏畠璧嬪箋?BR>
C錛嬶紜璇█鐨勭被鍨嬫瀬涓轟赴瀵岋紝鍗存病鏈夋弿榪頒竴涓弬鏁板埌搴曟槸in榪樻槸out銆俲ava涔熸病鏈夛紝浣嗗畠鍙互姝e父搴忓垪鍖栦竴涓猲ull鍊鹼紝鍦–錛嬶紜涓紝榪欏彲鑳藉瓨鍦ㄤ竴浜涢夯鐑︺?BR>
鍐嶈冭檻涓涓媍har*綾誨瀷錛屽亣濡傚畠鏄痠n鍙傛暟錛岄偅涔堝畠鏄浼犻掍竴涓瓧絎﹁繕鏄竴涓瓧絎︿覆錛烠錛嬶紜璇█娌℃湁瀵瑰畠榪涜鎻忚堪銆?BR>
鎵浠ヨ瀹炵幇涓涓垎甯冨紡鏈嶅姟鍖呰錛堟垨浠g悊錛夊簱錛屽繀欏昏鍙戝竷鑰呮彁渚涜繖浜涗俊鎭?BR>
鎴戜滑鐭ラ亾錛岃鏌ヨ涓涓繙紼嬫湇鍔★紝蹇呴』鏌ヨ鐩稿簲涓繪満绔彛錛岃幏鍙栨湇鍔′俊鎭傛渶綆鍗曠殑鏈嶅姟淇℃伅鍖呮嫭錛氭湇鍔″垪琛紝姣忎釜鏈嶅姟涓殑鏂規硶鍒楄〃錛屾柟娉曠殑綾誨瀷錛堝寘鎷弬鏁板拰榪斿洖鍊肩被鍨嬶紝in/out淇℃伅絳夛級銆?BR>
瀹為檯涓婏紝鎴戜滑鏄涓篊錛嬶紜澧炲姞涓浜涚畝鍗曠殑鑷渷鑳藉姏銆備笂闈㈤偅涓湇鍔″彂甯冩帴鍙o紝瀹為檯涓婄榪欎釜瑕佹眰榪樻湁寰堣繙錛屽啀鏉ョ湅涓涓嬶細
鍙互鎯寵錛屽畠鏄病鏈変竴鐐硅嚜鐪佽兘鍔涚殑錛屾垜浠浣曞悜瀹冩煡璇紝瀹冪殑鍚嶅瓧錛熷畠鐨勬柟娉曞垪琛紵鏂規硶鐨勭被鍨嬶紵瀹冨浣曚笌Test綾葷殑鎴愬憳鍑芥暟浠ュ強test_func鍑芥暟鍏寵仈錛?/P>
浜屻佹柟鍚戙?BR>
瑕佽涓婇潰閭d釜鏈嶅姟鍏鋒湁鑷渷鑳藉姏錛岃鍋氱殑鎵╁厖鍏跺疄騫朵笉澶氥傝冭檻涓嬮潰鐨勪唬鐮侊細
榪欏嚑涓狹ethod鍙互鐢ㄨ嚜宸卞啓鐨勫鎵樼被鏉ュ仛銆?BR>
1銆佸亣濡傛垜浠湪TestService鐨勬瀯閫犲嚱鏁伴噷緇欏畠鍒嗛厤涓涓淭estService鈥濆悕瀛楋紝騫朵笖Service綾誨疄鐜頒簡鏌ヨ鍚嶅瓧鐨勬帴鍙o紝閭d箞瀹冨氨鐭ラ亾瀹冭嚜宸辯殑鍚嶅瓧浜嗐?BR>
2銆佸亣濡傚湪TestService鐨勬瀯閫犲嚱鏁伴噷涓哄悇涓狹ethod鍒嗛厤鍚嶅瓧錛屽茍涓旀敞鍐屽埌TestService錛岄偅涔堝畠灝辮兘澶熸煡璇㈡柟娉曞垪琛ㄣ?BR>
3銆佹柟娉曠殑綾誨瀷錛熼氳繃妯℃澘鏂瑰紡錛屾妸鍚勪釜鍙傛暟綾誨瀷鏀墮泦璧鋒潵錛岀粰涓瓧絎︿覆鍚嶇О灝卞彲浠ヤ簡銆?BR>
浣跨敤瀹忔潵瀹炵幇錛屽ぇ姒傚彲浠ュ啓鎴愯繖鏍鳳細
閫氳繃涓婇潰榪欏嚑涓畯錛屾垜浠兘澶熺敓鎴怲estService澹版槑銆?BR>
涓嶈繃錛屾湁鍑犱釜闂錛岀綏鍒楀涓嬶紝騫朵竴涓瑙e喅瀹冿細
1銆佸浣曟妸鍑芥暟鎸囬拡浼犵粰瀹冿紵濡備綍鎶婃柟娉曞悕縐頒紶緇欏畠錛?BR>榪欎釜鍙槸C錛嬶紜璇█涓烘垜浠鍔犱簡涓浜涢夯鐑︼紝鎴戜滑鏃犳硶鍦ㄥ畾涔夋垚鍛樼殑鍦版柟璋冪敤瀹冪殑鏋勯犲嚱鏁幫紝涓嶈繃榪欏茍涓嶄細閫犳垚澶氬ぇ闅滅銆?BR>涓婇潰鐨凪ETHOD瀹忓鏋滃彧鏄敓鎴愮被鐨勫0鏄庯紝閭d箞鍑芥暟鎸囬拡鍙互鐪佺暐銆傛垜鎶婂畠鍔犱笂鐨勫師鍥犳槸錛屽畠鍙互琚垜鐢–trl+C, Ctrl+V榪欑涓栫晫涓婃渶鍏堣繘鐨勬妧鏈師鏍鋒嫹璐濅笅鏉ワ紝騫朵笖閫氳繃綆鍗曚慨鏀圭殑鏂規硶瀹炵幇榪欑涓栫晫涓婃渶鍏堣繘鐨勯噸鐢ㄣ?BR>
涓婇潰鐨勪唬鐮佺粡榪囦慨鏀癸紝緇撴灉灝辨垚榪欐牱錛?/P>
鐪嬩笂鍘誨搴斿緱闈炲父鏁撮綈錛屼慨鏀硅搗鏉ヤ篃姣旇緝綆鍗曘備笂闈㈤偅閮ㄥ垎琚墿鍏呬負濡備笅浠g爜錛?/P>
鍩烘湰涓婇渶瑕佺殑涓滆タ閮藉湪榪欓噷浜嗐?BR>
2銆佸鎴風鐨勯棶棰樸?BR>
涓婇潰榪欑鏄犲皠錛岀洿鎺ユ嬁鍒板鎴風浼氭湁闂錛孴est綾誨拰test_func鍑芥暟鎴戜滑騫朵笉鎵撶畻浜ょ粰瀹㈡埛绔紝鎵浠ヤ嬌鐢ㄥ嚱鏁版寚閽堜細鍑虹幇閾炬帴閿欒銆?BR>
瀹為檯涓婂鎴風涓嶉渶瑕佽繖涓紝鎴戜滑鎯沖姙娉曟妸瀹冩嬁鎺夊氨琛屼簡銆傚鎴風瀹為檯闇瑕佺敓鎴愮殑浠g爜濡備笅錛?BR>
榪樻槸涓婇潰鎻愬埌鐨勶紝C++緇欐垜浠甫鏉ョ殑楹葷儲銆傝繖嬈¢渶瑕佸彟涓緇勫畯鏉ュ畬鎴愬畠錛?/P>
METHOD*鍜孧ETHOD_DEFINE*瀹忕殑鍙傛暟閮芥湁涓浜涘浣欑殑淇℃伅錛屾病鏈夊幓鎺夋槸鍥犱負鏀懼湪涓璧峰鏄撶湅鍒板啓閿欑殑鍦版柟銆傦紙榪欎釜鎶宸ф潵婧愪簬鍓嶅嚑澶╃湅鐨勪竴綃嘊LOG錛屽緢鎶ユ瓑娌℃湁璁頒笅鍦板潃錛?BR>
3銆佷嬌鐢ㄧ殑闂銆?BR>
濡備綍鎵嶈兘姣旇緝鏂逛究鍦頒嬌鐢紵鎴戣冭檻浜嗕笅闈㈣繖縐嶆柟寮忥細

Method::operator ()鐨勫悇涓弬鏁伴兘灝嗗彲浠ユ帴鍙楃浉瀹圭殑綾誨瀷錛屽儚涓婇潰涓鏍鳳紝鍥犱負鍦═estService涓垜浠凡緇忓畾涔変簡瀹冭浼犺緭鐨勫肩殑綾誨瀷銆?BR>
a.NONE鏄粈涔堬紵鍏跺疄鏄負寮傛璋冪敤鑰冭檻鐨勩傚亣濡傛寚瀹氭煇涓狾UT鍙傛暟涓篘ONE錛屽垯榪欎釜鍙傛暟鐨勫煎茍涓嶇湡姝g殑OUT錛岃屾槸淇濆瓨鍦∕ethod涓傚疄闄呬笂Method涓繚瀛樻瘡涓弬鏁扮殑鍊箋?BR>
b.Method涓嶴ervice濡備綍鍙戠敓鍏崇郴錛?BR>浠嶵estService鐨勫畾涔変腑鎴戜滑鐭ラ亾錛孧ethod鍚慡ervice娉ㄥ唽鑷繁浠ュ疄鐜拌嚜鐪侊紝浣嗗畠鍚屾椂涔熶細淇濆瓨Service鐨勬寚鍚戙?BR>鎴戜滑鐨凱roxy瀹為檯涓婃槸涓涓戶鎵挎ā鏉匡紝涓婇潰騫舵病鏈夋妸瀹冩寚鍑烘潵銆傚畠鐨勫畾涔夋槸錛?/P>

鎵浠ユ垜浠殑TestService鍏跺疄涔熸槸妯℃澘綾伙紝瀹冨皢浣跨敤XProxy涓畾涔夌殑搴忓垪鍖栫被銆俋Proxy灝嗗疄鐜癝ervice鍩虹被涓簭鍒楀寲铏氬嚱鏁頒互鍙婅皟鐢ㄨ櫄鍑芥暟銆?BR>
褰撲竴涓狹ethod璋冪敤鏃訛紝瀹冧細璋冪敤Service鐨勫簭鍒楀寲錛岀敱浜庤閲嶅啓浜嗭紝鎵浠ヨ皟鐢ㄧ殑鏄疿Proxy涓殑搴忓垪鍖栨柟娉曘傝繖涓柟娉曚細鎶婅繖涓狹ethod鐨勫悇in/inout鍙傛暟搴忓垪鍖栵紝鐒跺悗鎵ц榪滅▼璋冪敤錛屽啀鎶婅皟鐢ㄧ粨鏋滃弽搴忓垪鍖栫粰inout/out鍙傛暟銆?BR>
4銆佸叾瀹冩兂娉曘?BR>
鍦ㄨ冭檻涓婇潰鐨勫畾涔夋柟寮忔椂錛屾垜涔熻冭檻浜嗗叾瀹冩柟寮忥紝涓昏鏄繑鍥炲煎鐞嗙殑鏂規硶錛岀畝榪板涓嬨?BR>
鍓嶉潰鎴戜滑鍋囪浜嗕竴孌靛皢琚紑鏀句負榪滅▼鏈嶅姟鐨勪唬鐮侊細
鍦ㄥ墠闈㈢殑鍋氭硶涓紝鎴戜滑鐨勬湇鍔℃弿榪版槸鏀懼湪閭d竴緇勫畯閲岄潰錛屽ソ澶勬槸涓嶇敤鏀硅繖孌典唬鐮侊紝鍧忓灝辨槸浠g爜瀹氫箟鐨勫湴鏂瑰拰鎻忚堪涓嶅湪涓璧鳳紝鍗忚皟鍙兘浼氭湁涓浜涗笉渚褲?BR>
鎴戜篃鑰冭檻浜嗗彟涓縐嶅仛娉曪細
瀵逛簬瀹炵幇浠g爜錛屽彧闇瑕佷慨鏀硅繑鍥炲間負void鐨勫嚱鏁幫紝鎶妑eturn;淇敼涓簉eturn VOID;錛屽茍涓斾負娌℃湁鍐欐璇彞鐨勫垎鏀姞涓婃鍙ャ?BR>
VOID鏄竴涓壒孌婄被鍨嬬殑闈欐佸彉閲忥紝涓撲負void榪斿洖鍊肩殑鍑芥暟璁懼畾銆?BR>
榪欑鍋氭硶淇敼浜嗗師鏈夌殑浠g爜錛屼笉榪囧湪瀹氫箟鏈嶅姟鏃跺彲浠ヨ妭鐪佷竴浜涘伐浣滐細
瀹冩墍闇瑕佺殑鍑芥暟綾誨瀷錛屽皢鐢卞嚱鏁版寚閽堟帹瀵箋?BR>
鍦℅錛嬶紜緙栬瘧鍣ㄤ笅錛屽彲浠ヤ嬌鐢╰ypeof鏉ヨ幏寰楀嚱鏁版寚閽堢殑綾誨瀷鑰屼笉闇瑕佺湡寰楄幏寰楀嚱鏁版寚閽堝鹼紝涓嶈繃鐩墠浠呬粎鍦℅錛嬶紜涓嬪彲鐢ㄣ傦紙欏轟究璇翠竴涓嬶紝typeof宸茬粡鍒楀叆c++0x錛?BR>
鏈緇堟垜鏀懼純浜嗚繖涓兂娉曪紝姣曠珶瀹冭淇敼鐜版湁鐨勪唬鐮侊紝鏌愪簺鎯呭喌涓嬭繖鏄笉鍙兘鐨勶紝鑰屼笖typeof鐩墠涔熶笉鑳借法緙栬瘧鍣ㄣ?BR>
涓夈佸疄鐜般?BR>
鑰佸疄璇存垜鐜板湪榪樻病鏈変竴浠藉畬鏁寸殑鎴栧崐瀹屾暣鐨勫疄鐜幫紝澶ч儴鍒嗘兂娉曡繕鍦ㄥご鑴戜腑錛屾祴璇曚唬鐮佸掓槸鍐欎簡涓嶅皯錛屼富瑕佹槸鐢ㄦ潵嫻嬭瘯涓婅堪鎯蟲硶鑳藉惁瀹炵幇錛屾垜鎯沖ぇ閮ㄥ垎鎯呭喌閮藉凡緇忔祴璇曚簡錛屽彧闇瑕佹湁鏃墮棿鏉ユ妸瀹冨疄鐜板嚭鏉ャ?BR>
榪欐槸鎴戣繎鏈熻鍋氱殑浜嬩箣涓錛屼簤鍙栨湀鍐呮妸瀹冨仛瀹岀艦銆?/P>