锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美黄色一区,欧美三级电影大全,国产亚洲精品bt天堂精选http://m.shnenglu.com/richardhe/category/6665.html瀛︽棤姝㈠!姘歌繙瀛︿笅鍘?zh-cnSun, 20 Jul 2008 02:55:46 GMTSun, 20 Jul 2008 02:55:46 GMT60綆浠婤oost.Regexhttp://m.shnenglu.com/richardhe/articles/56662.htmlRichardHeRichardHeSun, 20 Jul 2008 02:31:00 GMThttp://m.shnenglu.com/richardhe/articles/56662.htmlhttp://m.shnenglu.com/richardhe/comments/56662.htmlhttp://m.shnenglu.com/richardhe/articles/56662.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/56662.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/56662.html

綆浠?sup>1
    姝? 鍒欒〃杈懼紡錛圧egular expression錛夋槸涓縐嶅湪鏂囨湰澶勭悊涓粡甯哥敤鍒扮殑妯″紡鍖歸厤鐨勫艦寮忥紝鍙兘璁稿鐢ㄦ埛鐔熸倝Unix涓嬬殑grep,sed,awk絳夊伐鍏鋒垨鑰卲erl璇█錛屽畠 浠兘騫挎硾鍦扮敤鍒頒簡姝e垯琛ㄨ揪寮忋備紶緇熺殑C++鐢ㄦ埛榪樺彈闄愪簬鐢≒OSIX C API's錛圥ortable operateing system interface standard)鏉ユ搷浣滄鍒欒〃杈懼紡錛岃宺egex++宸茬粡鎻愪緵浜嗚繖浜汚PI's錛岃櫧鐒跺畠涓嶄竴瀹氭槸浣跨敤POSIX C 姝e垯琛ㄨ揪寮忓簱鐨勬渶濂芥柟娉曘傛瘮濡俽egex++鑳藉鐞嗗瀛楃瀛楃涓詫紙wide character strings錛夛紝鎴栬呮悳绱€佹浛鎹㈡搷浣滐紙鍦ㄦ煇縐嶆剰涔変笂綾諱技浜巗ed鎴杙erl錛夛紝榪欎簺鍦ㄤ紶緇熺殑C 搴撲腑鏄笉鑳藉疄鐜扮殑銆?br>綾籦oost::reg_expression鏄痳egex++搴撲腑鐨勫叧閿被錛屽畠琛ㄧず“鏈哄櫒鍙”鐨勬鍒欒〃杈懼紡錛宺eg_expression 鏄湪string鐨勫熀紜涔嬩笂鏋勫緩鐨勶紝鍙互璁や負瀹冩槸涓涓叿鏈塻tring鐨勫姛鑳斤紝澶栧姞榪欎釜姝e垯琛ㄨ揪寮忕畻娉曟墍闇瑕佺殑鐘舵佹満銆?br>鍍弒td::basic_string涓鏍鳳紝瀹冩彁渚涗簡涓や釜閽堝char鍜寃char_t鐨勭壒鍖栫増鏈細

namespace boost{
template <class charT,
          class traits = regex_traits<charT>,
          class Allocator = std::allocator<charT> >
class basic_regex;
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
}

    瑕佺煡閬搑egex++搴撳埌搴曟湁浠涔堢敤錛熷彲浠ヨ瘯鎯蟲垜浠鍐欎竴涓俊鐢ㄥ崱澶勭悊紼嬪簭銆備俊鐢ㄥ崱閫氬父鏈?6浣嶆暟瀛楃粍鎴愮殑 鍙風爜錛屽叾涓瘡鍥涗綅涓緇勶紝鐢ㄧ┖鏍兼垨榪炲瓧鍙烽殧寮銆傚湪灝嗚繖浜涗俊鐢ㄥ崱鍙風爜瀛樺叆鏁版嵁搴撲箣鍓嶏紝鎴戜滑闅鵑亾涓嶈媯楠岃繖浜涙暟瀛楁槸鍚︾鍚堟紜牸寮忎箞錛熶負浜嗗尮閰嶄換浣曚竴涓暟瀛楁垜浠? 鍙互鐢ㄦ鍒欒〃杈懼紡[0-9]錛屾暟瀛椾覆鐨勫搴﹀彲浠ョ敤[[:digit:]],褰撶劧榪欎簺鏄疨OSIX鏍囧噯銆傚湪regex++鍜宲erl涓彲綆鍖栦負\d錛堟敞鎰忚 澶氳佺殑搴撳懼悜浜庣‖緙栫爜鍒癈-locale錛屽洜姝よ繖涓嶆槸浠涔堥棶棰橈級銆備笅闈㈢殑姝e垯琛ㄨ揪寮忓彲浠ユ楠屼俊鐢ㄥ崱鍙風爜鐨勬牸寮忋?br>(\d{4}[- ]){3}\d{4}
    ()鏍囪瀛愯〃杈懼紡錛寋4}琛ㄧず閲嶅4嬈°傝繖浠呮槸涓涓猵erl,awk,egrep鐨勬鍒欒〃杈懼紡鐨勪緥瀛愩俽egex++涔熸敮鎸侀偅浜泂ed,grep鐢ㄥ埌鐨勬瘮杈冭佺殑“鍩烘湰”璇硶錛岃櫧鐒跺畠浠緢灝戠敤鍒幫紝闄ら潪浣犻渶瑕侀噸鐢ㄤ竴浜涘凡鏈夌殑鍩烘湰姝e垯琛ㄨ揪寮忋?/font>

    鐜板湪璁╂垜浠妸榪欎釜琛ㄨ揪寮忕疆浜嶤++浠g爜涓潵媯楠屼俊鐢ㄥ崱鍙風爜鐨勬牸寮忥細

bool validate_card_format(const std::string s)
{
   static const boost::regex e("(
\\d{4}[- ]){3}\\d{4}");
   return regex_match(s, e);
}

    娉ㄦ剰鎴戜滑浠ュ墠鏄浣曞皢鏌愪簺棰濆鐨勮漿涔夊簭鍒楋紙鎴栬呯炕璇戞垚錛氳漿涔夊瓧絎︼級娣誨姞鍒拌〃杈懼紡鐨勶細瑕佺煡閬擄紝姝e垯琛ㄨ揪寮忓紩鎿庡鐞嗚漿涔夊瓧絎﹀墠錛岃杞箟瀛楃鍙兘琚?C++緙栬瘧鍣ㄨ瘑鍒竴嬈★紝鍥犳錛屽湪C++浠g爜涓祵鍏ユ鍒欒〃杈懼紡鐨勮漿涔夊瓧絎﹀繀欏誨弻鍐欙紙鍐欎袱嬈★級銆?br>    榪樿娉ㄦ剰鍒頒綘鐨勭紪璇戝櫒蹇呴』鏀寔Koening lookup 2錛堟瘮濡俈C6灝變笉鏀寔錛夛紝鍚﹀垯浣犻渶瑕侀檮鍔犱竴浜沚oost::prefixes鍒版煇浜涘嚱鏁板紩鐢ㄤ腑銆?br>    閭? 浜涚啛鎮変俊鐢ㄥ崱鎿嶄綔鐨勪漢錛屽彲鑳借繕浼氭兂鍒頒笂闈㈢殑閭g鏍煎紡閫傚悎浜庝漢鐨勯槄璇伙紝騫朵笉琛ㄧず緗戜笂淇$敤鍗$郴緇熻姹傜殑鏍煎紡錛堝彲鑳芥槸16鎴?5涓病鏈夐棿闅旂鐨勬暟瀛椾覆錛夈傛垜浠渶 瑕佷竴縐嶇畝鍗曠殑杞崲鏂規硶錛屾垜浠渶瑕?涓瓧絎︿覆錛?涓槸姝e垯琛ㄨ揪寮忥紝涓涓槸鏍煎紡瀛楃涓詫紙鎻愪緵涓縐嶈鍖歸厤鐨勫唴瀹圭殑鎻忚堪錛夈傚湪regex++涓紝search鍜? replace閮借兘瀹屾垚regex_merge綆楁硶錛屽浜庝俊鐢ㄥ崱鐨勪緥瀛愭垜浠粰鍑轟簡涓嬮潰2涓畻娉曠敤浜庢牸寮忚漿鎹細

// match any format with the regular expression:
const boost::regex e("
\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z");
const std::string machine_format("
\\1\\2\\3\\4");
const std::string human_format("
\\1-\\2-\\3-\\4");

std::string machine_readable_card_number(const std::string s)
{
   return regex_merge(s, e, machine_format, boost::match_default | boost::format_sed);
}

std::string human_readable_card_number(const std::string s)
{
   return regex_merge(s, e, human_format, boost::match_default | boost::format_sed);
}


    榪欏効錛屾垜浠敤姝e垯琛ㄨ揪寮忎腑鐨勫瓙寮忔妸鍙風爜鍒嗕負4鍧楋紝format string 鐢ㄧ被浼約ed鐨勮娉曟妸琚尮閰嶇殑鍐呭鏇挎崲涓鴻瀹氭牸寮忋?br>    涓婇潰鐨勪緥瀛愪腑錛屾垜浠繕娌℃湁鐩存帴鎿嶄綔鍖歸厤緇撴灉錛屽尮閰嶇粨鏋滃寘鎷叏浣撳尮閰嶅拰涓浜涘瓙寮忕殑鍖歸厤銆傚綋闇瑕佹鍒欒〃杈懼紡鐨勫尮閰嶇粨鏋滄椂錛屽氨闇瑕佺敤鍒癱lass match_results鐨勫疄渚嬶紝涓嬮潰鏄父鐢ㄧ被鍨嬬殑鐗瑰寲鐗堟湰錛?br>
namespace boost{
typedef match_results<const char*> cmatch;
typedef match_results<const wchar_t*> wcmatch;
typedef match_results<std::string::const_iterator> smatch;
typedef match_results<std::wstring::const_iterator> wsmatch;
}

    regex_search鍜宺egex_grep綆楁硶閮戒嬌鐢ㄥ埌match_result銆?br>    娉ㄦ剰榪欎簺綆楁硶騫朵笉灞闄愪簬涓鑸殑C-strings,浠諱綍鍙屽悜榪唬鍣紙bidirectional iterator錛夌被鍨嬮兘鑳借鎼滅儲錛岃繖涓烘棤緙濇悳绱換浣曠被鍨嬫暟鎹彁渚涗簡鍙兘鎬с?/font>

    瀵逛簬閭d簺涓嶅枩嬈㈡ā鏉匡紙templates錛夌殑浜鴻繕鍙互浣跨敤class RegEx,瀹冩槸瀵規ā鏉夸唬鐮佺殑楂樺眰嬈″寘瑁咃紝瀹冧負閭d簺浣跨敤涓嶅埌搴撶殑鏁翠釜鍔熻兘鐨勪漢鎻愪緵浜嗙畝鍗曠殑鎺ュ彛錛屽綋鐒跺畠浠呮敮鎸佺獎瀛楃錛坣arrow character錛夊拰“鎵╁睍”鐨勬鍒欒〃杈懼紡璇硶銆?br>    瀵逛簬鎯沖吋瀹筆OSIX鐨勪漢鍙互浣跨敤POSIXAPI鍑芥暟錛歳egcomp,regexec,regfree,regerror,榪欎簺瀵筺arrow character鍜孶nicode閮介傜敤銆?/font>

    鏈鍚庢敞鎰忥紝榪欎釜搴撶幇鍦ㄦ敮鎸佽繍琛屾椂鏈湴鍖栵紙run-time localization錛夛紝瀹冭兘瀹屽叏璇嗗埆POSIX姝e垯琛ㄨ揪寮忚娉曪紝鍖呮嫭涓浜涘瀛楃鐨勫厓绱犳瘮杈冨拰鍚岀瓑綾誨瀷鐨勯珮綰х壒鎬э紝瀹冭繕鑳藉吋瀹瑰叾瀹冧竴浜涙鍒欒〃杈懼紡搴撳寘鎷珿NU銆丅SD4鐨剅egex鍖呫?/font>

瀹夎鍜岄厤緗?/strong>

    棣栧厛褰撲綘浠巣ip鏂囦歡瑙e帇鏈簱鏃跺繀欏諱繚鐣欏畠鐨勫唴閮ㄧ粨鏋勶紝濡傛灉浣犳病榪欐牱鍋氾紝閭e彧濂藉垹闄や綘瑙e帇鐨勬枃浠訛紝閲嶇幇鏉ヤ竴嬈°?br>    鐢變簬鏀寔澶у鏁板父瑙佺殑緙栬瘧鍣?鏍囧噯搴?騫沖彴錛岃繖涓簱涓嶉渶瑕佷綔浣跨敤鍓嶇殑閰嶇疆銆傚鏋滀綘紕板埌閰嶇疆闂錛屾垨鎯蟲祴璇曚綘鐨勭紪璇戝櫒鐨勯厤緗俊鎭紝鍙互鍙傝?閰嶇疆鏂囨。錛堣繖鍜宐oost鐨勫叾瀹冩墍鏈夌殑搴撶殑澶勭悊榪囩▼閮戒竴鏍鳳級銆?/font>

    鐢變簬鏈簱娣峰悎浜嗘ā鏉夸唬鐮侊紙澶存枃浠朵腑錛夊拰闈欐佷唬鐮佹暟鎹紙cpp鏂囦歡涓級錛屾墍浠ュ湪浣犱嬌鐢ㄤ箣鍓嶏紝蹇呴』灝嗗簱鏀寔鐨勪唬鐮?鐢熸垚鍒板簱鍐呭拰妗f鏂囦歡涓備互涓嬫槸鍑犱釜鍏蜂綋騫沖彴鐨勬搷浣滄楠わ細
Borland C++ Builder
鐣?/font>
Microsoft Visual C++ 6 and 7
濡傛灉浣犱嬌鐢╒C5錛屼綘鍙兘瑕佹壘涓涓嬫湰搴撶殑浠ュ墠鐗堟湰銆?br>鎵撳紑鍛戒護鎻愮ず絎︼紙鍏禡SVC鐜鍙橀噺蹇呴』宸插畾涔夛紝濡傛灉娌℃湁鍙繍琛孷cvars32.bat錛屼綅浜?lt;VC6>\bin錛夛紝榪涘叆<boost>\libs\regex\build 鐩綍
閫夋嫨姝g‘鐨刴akefile,VC6++鐨勬槸vc6.mak,鏀寔STLPort鐨勬槸vc6-stlport.mak
濡備笅璋冪敤
nmake -fvc6.mak
濡傛灉鎯沖湪VC6瀛愮洰褰曞寘鍚墍鏈夌殑lib銆乨ll鏂囦歡錛宭ib鏂囦歡鎷峰湪<VC6>\lib錛宒ll鏂囦歡鎷峰湪<VC6>\bin錛屽彲浣跨敤
nmake -fvc6.mak install
鍒犻櫎鐢熸垚榪囩▼涓墍鏈夌殑涓存椂鏂囦歡錛屽彲浣跨敤
nmake -fvc6.mak clean

鏈鍚庡彧闇娣誨姞<boost>鏍圭洰褰曞埌浣犵殑宸ョ▼鎵鍖呭惈鐨勭洰褰曞垪琛ㄤ腑銆傛病鏈夊繀瑕佹墜鍔ㄥ皢*.lib鏂囦歡鍔犲埌宸ョ▼涓紝鍥犱負鍦ㄥご鏂囦歡浼氶夋嫨姝g‘鐨?lib鏂囦歡銆?br>娉ㄦ剰錛氬鏋滄兂闈欐佸湴閾懼叆regex搴擄紝鍙畾涔塀OOST_REGEX_STATIC_LINK錛堝湪release鐗堜腑鐢熸晥錛夈?br>      濡傛灉鎯崇洿鎺ヤ嬌鐢ㄦ簮鏂囦歡錛屽彲瀹氫箟BOOST_REGEX_NO_LIB錛岃繖鏍瘋嚜鍔ㄩ夋嫨搴撳皢澶辨晥銆?/font>

1.綆浠嬪嚭澶勶細http://www.boost.org/libs/regex/doc/introduction.html
2.Koening lookup錛歐hen a function is called, in order to determine if that function is visible in the current scope, the namespaces in which the functions parameters reside must be taken into account.

   


RichardHe 2008-07-20 10:31 鍙戣〃璇勮
]]>
boost::regexhttp://m.shnenglu.com/richardhe/articles/56653.htmlRichardHeRichardHeSun, 20 Jul 2008 01:45:00 GMThttp://m.shnenglu.com/richardhe/articles/56653.htmlhttp://m.shnenglu.com/richardhe/comments/56653.htmlhttp://m.shnenglu.com/richardhe/articles/56653.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/56653.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/56653.html

boost::regex

  • boost::regex鐨勭敤娉?/li>

        bool validate_card_format(const std::string s)
        {
           static const boost::regex e("(\\d{4}[- ]){3}\\d{4}");
           return regex_match(s, e);
        }

  • boost::regex鐨勯粯璁ゆ鍒欒〃杈懼紡璇硶鏄痯erl璇硶

        boost::regex鏀寔perl regular琛ㄨ揪寮忋丳OSIX-Extended regular琛ㄨ揪寮忓拰POSIX-Basic Regular琛ㄨ揪寮忥紝浣嗛粯璁ょ殑琛ㄨ揪寮忚娉曟槸perl璇硶錛屽鏋滆浣跨敤鍏朵綑涓ょ璇硶闇瑕佸湪鏋勯犺〃杈懼紡鐨勬椂鍊欐槑紜寚瀹氥?/p>

        渚嬪錛屼笅闈袱縐嶆柟娉曟晥鏋滅浉鍚?br>        // e1 is a case sensitive Perl regular expression: 
        // since Perl is the default option there's no need to explicitly specify the syntax used here:
        boost::regex e1(my_expression);
        // e2 a case insensitive Perl regular expression:
        boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);

  • perl姝e垯琛ㄨ揪寮忚娉?/li>

        perl姝e垯琛ㄨ揪寮忚娉曞彲鍙傝銆妏erl璇█鍏ラ棬銆嬬7銆?銆?绔犳垨boost鐨勬枃妗c傝繖閲屽垪鍑虹殑璇硶鏄笉鍏ㄩ潰鐨勶紝鑰屼笖閮ㄥ垎璇存槑鍙兘騫朵笉娓呮銆?/p>

        . 浠繪剰瀛楃;浣跨敤match_no_dot_null鏍囧織鏃朵笉鍖歸厤NULL瀛楃; 浣跨敤match_not_dot_newline鏃朵笉鍖歸厤鎹㈣瀛楃

        ^ 鍖歸厤琛岀殑寮濮?br>        $ 鍖歸厤琛岀殑緇撴潫
        * 閲嶅闆舵鎴栧垯鏇村,渚嬪a*b鍙尮閰峛,ab,aab,aaaaaaab
        + 閲嶅涓嬈′互涓婏紝渚嬪a+b鍙尮閰峚b,aab,aaaaaaaab銆備絾涓嶈兘鍖歸厤b浜?br>        ? 闆舵鎴栧垯涓嬈★紝渚嬪ca?b鍖歸厤cb,cab浣嗕笉鍖硅caab    
        a{n} 鍖歸厤瀛楃'a'閲嶅n嬈?br>        a{n,}錛屽瓧絎閲嶅n嬈′互涓婏紙鍚玭嬈★級
        a{n,m} a閲嶅n鍒癿嬈★紙鍚級

        *?   鍖歸厤鍓嶄竴涓師瀛愰浂嬈′互涓?br>        +?   鍖歸厤鍓嶄竴涓師瀛愪竴嬈′互涓?br>        ??   鍖歸厤鍓嶄竴涓師瀛愰浂嬈′互涓?br>        {n,}?  鍖歸厤鍓嶄竴涓師瀛恘嬈′互涓?鍚?
        {n,m?  鍖歸厤鍓嶄竴涓師瀛恘鍒癿嬈?鍚?

        | 鎴栨搷浣滐紝渚嬪ab(d|ef)鍖歸厤abd鎴栧垯abef
        [] 瀛楃闆嗘搷浣滐紝渚嬪[abc]灝嗗尮閰嶄換浣曞崟涓瓧絎?a'錛?b'錛?c'
        [a-d]錛岃〃紺篴銆乥銆乧銆乨
        ^鍚︽搷浣滐紝渚嬪[^a-c]琛ㄧずa鑷砪涔嬪鐨勬墍鏈夊瓧絎?br>

  • boost::regex瀵箄nicode緙栫爜鐨勬敮鎸?/li>

        boost::regex浣跨敤ICU鏉ュ疄鐜板unicode鍙妘nicode鍙樼鐨勬敮鎸侊紝榪欓渶瑕佸湪緙栬瘧boost鐨勬椂鍊欐寚鍑烘槸鍚︿嬌 鐢↖CU浠ュ強ICU鎵鍦ㄧ殑鐩綍銆傚惁鍒欑紪璇戝嚭鏉ョ殑boost::regex涓嶆敮鎸乽nicode緙栫爜銆傚叾涓璪oost::wregex鏀寔unicode緙? 鐮佺殑鎼滅儲錛屽鏋滆鎼滅儲UTF-8銆乁TF-16銆乁FT-32緙栫爜鐨勫瓧絎︿覆錛屽垯瑕佺敤boost::u32regex銆傛敞鎰廱oost::wregex鍙兘 鏀寔unicode緙栫爜錛屼笉鑳芥敮鎸乽ft緙栫爜銆?/p>

  • 鎼滅儲鏃跺浣曞拷鐣ュぇ灝忓啓

        濡傛灉瑕佸湪鎼滅儲鏃跺拷鐣ュぇ灝忓啓錛堝嵆澶у皬鍐欎笉鏁忔劅錛夛紝鍒欒鐢ㄥ埌琛ㄨ揪寮忛夐」boost::regex::icase錛屼緥 濡傦細 boost::regex e2(my_expression, boost::regex::perl|boost::regex::icase);



RichardHe 2008-07-20 09:45 鍙戣〃璇勮
]]>
C/C++涓畯鐨勪嬌鐢?/title><link>http://m.shnenglu.com/richardhe/articles/56328.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 16 Jul 2008 10:10:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/56328.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/56328.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/56328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/56328.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/56328.html</trackback:ping><description><![CDATA[鍏充簬## 鍜?#鍙?@鐨勭敤娉?br><br><br>## 鏄繛鎺ョ鍙?榪炴帴涓や釜瀹?##琚О涓鴻繛鎺ョ錛坈oncatenator錛夛紝鐢ㄦ潵灝嗕袱涓猅oken榪炴帴涓轟竴涓猅oken銆傛敞鎰忚繖閲岃繛鎺ョ殑瀵硅薄鏄疶oken灝辮錛岃屼笉涓瀹氭槸瀹忕殑鍙?<br>閲忋傛瘮濡備綘瑕佸仛涓涓彍鍗曢」鍛戒護鍚嶅拰鍑芥暟鎸囬拡緇勬垚鐨勭粨鏋勪綋鐨勬暟緇勶紝騫朵笖甯屾湜鍦ㄥ嚱鏁板悕鍜岃彍鍗曢」鍛戒護鍚嶄箣闂存湁鐩磋鐨勩佸悕瀛椾笂鐨勫叧緋匯傞偅灝卞彲浠ヤ嬌鐢細瀹忓弬鏁?# <br>鍥哄畾閮ㄥ垎銆傚綋鐒惰繕鍙互n涓?#絎﹀彿榪炴帴 n+1涓猅oken錛岃繖涓壒鎬т篃鏄?絎﹀彿鎵涓嶅叿澶囩殑銆?<br>#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d<br>typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);<br>// 榪欓噷榪欎釜璇彞灝嗗睍寮涓猴細<br>//      typedef struct _record_type name_company_position_salary;<br><br><br>#@鍔熻兘鏄皢鍏跺悗闈㈢殑瀹忓弬鏁拌繘琛屽瓧絎﹀寲銆?br>#define makechar(x)  <a href="mailto:#@xa">#@x<br>a</a> = makechar(b);<br>//a = 'b';<br><br><br>#鏄妸鍚嶅瓧浠f浛鎴愬瓧絎︿覆,瀹忎綋涓紝#鐨勫姛鑳芥槸灝嗗叾鍚庨潰鐨勫畯鍙傛暟榪涜瀛楃涓插寲鎿嶄綔錛圫tringfication錛夛紝綆鍗曡灝辨槸鍦ㄥ瀹冩墍寮曠敤鐨勫畯鍙橀噺閫氳繃鏇挎崲鍚庡湪鍏跺乏鍙沖悇鍔犱笂涓涓?<br>鍙屽紩鍙楓?br>#define WARN_IF(EXP)        \<br>        do{ if (EXP)        \<br>                fprintf(stderr, "Warning: " #EXP "\n"); }       \<br>        while(0)<br>閭d箞瀹為檯浣跨敤涓細鍑虹幇涓嬮潰鎵紺虹殑鏇挎崲榪囩▼錛?<br>WARN_IF (divider == 0);<br>琚浛鎹負<br>do {<br>        if (divider == 0)<br>fprintf(stderr, "Warning" "divider == 0" "\n");<br>} while(0);<br>榪欐牱姣忔divider錛堥櫎鏁幫級涓?鐨勬椂鍊欎究浼氬湪鏍囧噯閿欒嫻佷笂杈撳嚭涓涓彁紺轟俊鎭?<br><br><br> <font style="font-size: 12pt;" face="#ce_temp_font#"><dt><strong>!IF </strong><span id="hvzpftn" class="parameter">constantexpression</span> </dt><dd> <p>濡傛灉 <span id="hvzpftn" class="parameter">constantexpression</span> 璁$畻緇撴灉涓洪潪闆跺鹼紝鍒欏鐞?<strong>!IF</strong> 鍜屼笅涓涓?<strong>!ELSE</strong> 鎴?<strong>!ENDIF</strong> 涔嬮棿鐨勮鍙ャ?br><strong>!ENDIF</strong> </p> </dd> <dd> <p>鏍囪 <strong>!IF</strong>銆?strong>!IFDEF</strong> 鎴?<strong>!IFNDEF</strong> 鍧楃殑緇撳熬銆傚悓涓琛屼笂 <strong>!ENDIF</strong> 鍚庨潰鐨勬墍鏈夋枃鏈蹇界暐銆?/p> </dd></font><img src ="http://m.shnenglu.com/richardhe/aggbug/56328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-07-16 18:10 <a href="http://m.shnenglu.com/richardhe/articles/56328.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>extern "C"http://m.shnenglu.com/richardhe/articles/55817.htmlRichardHeRichardHeThu, 10 Jul 2008 09:27:00 GMThttp://m.shnenglu.com/richardhe/articles/55817.htmlhttp://m.shnenglu.com/richardhe/comments/55817.htmlhttp://m.shnenglu.com/richardhe/articles/55817.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55817.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55817.html鍓嶄簺澶╋紝緙栫▼搴忔槸鐢ㄥ埌浜嗗緢涔呬互鍓嶅啓鐨凜紼嬪簭錛屾兂鎶婇噷闈㈢殑鍑芥暟鍒╃敤璧鋒潵錛岃繛鎺ュ彂鐜板嚭鐜頒簡鎵句笉鍒板叿浣撳嚱鏁扮殑閿欒錛?/p>

浠ヤ笅鏄亣璁炬棫鐨凜紼嬪簭搴?/p>

C鐨勫ご鏂囦歡

/*-----------c.h--------------*/
#ifndef _C_H_
#define _C_H_
extern int add(int x, int y);
#endif

C鐨勬簮鏂囦歡

/*-----------c.c--------------*/
int
add(int x, int y){
return
x+y;
}

C++鐨勮皟鐢?/p>

/*-----------cpp.cpp--------------*/
#include "c.h"
void main()
{

add(1, 0);
}

榪欐牱緙栬瘧浼氫駭鐢熼敊璇痗pp.obj : error LNK2001: unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z)錛屽師鍥犳槸鎵句笉鍒癮dd鐨勭洰鏍囨ā鍧?/p>

榪欐墠浠ゆ垜鎯寵搗C++閲嶈澆鐨勫嚱鏁板懡鍚嶆柟寮忓拰C鍑芥暟鐨勫懡鍚嶆柟寮忥紝璁╂垜浠洖欏句竴涓嬶細C涓嚱鏁扮紪璇戝悗鍛藉悕浼氬湪鍑芥暟鍚嶅墠鍔犱互"_",姣斿add鍑芥暟緙栬瘧鎴恛bj鏂囦歡鏃剁殑瀹為檯鍛藉悕涓篲add錛岃宑++鍛藉悕鍒欎笉鍚岋紝涓轟簡瀹炵幇鍑芥暟閲嶈澆鍚屾牱鐨勫嚱鏁板悕add鍥犲弬鏁扮殑涓嶅悓浼氳緙栬瘧鎴愪笉鍚岀殑鍚嶅瓧

渚嬪

int add(int , int)==>add@@YAHHH@Z,

float add(float , float )==>add@@YAMMM@Z,

浠ヤ笂鏄疺C6鐨勫懡鍚嶆柟寮忥紝涓嶅悓鐨勭紪璇戝櫒浼氫笉鍚岋紝鎬諱箣涓嶅悓鐨勫弬鏁板悓鏍風殑鍑芥暟鍚嶅皢緙栬瘧鎴愪笉鍚岀洰鏍囧悕錛屼互渚夸簬鍑芥暟閲嶈澆鏄皟鐢ㄥ叿浣撶殑鍑芥暟銆?/p>

緙栬瘧cpp.cpp涓紪璇戝櫒鍦╟pp鏂囦歡涓彂鐜癮dd(1, 0);鐨勮皟鐢ㄨ屽嚱鏁板0鏄庝負extern int add(int x, int y);緙栬瘧鍣ㄥ氨鍐沖畾鍘繪壘add@@YAHHH@Z錛屽彲鎯滀粬鎵句笉鍒幫紝鍥犱負C鐨勬簮鏂囦歡鎶?font color="#990000">extern int add(int x, int y);緙栬瘧鎴恄add浜嗭紱

涓轟簡瑙e喅榪欎釜闂C++閲囩敤浜唀xtern "C",榪欏氨鏄垜浠殑涓婚錛屾兂瑕佸埄鐢ㄤ互鍓嶇殑C紼嬪簭搴擄紝閭d箞浣犲氨瑕佸浼氬畠錛屾垜浠彲浠ョ湅浠ヤ笅鏍囧噯澶存枃浠朵綘浼氬彂鐜幫紝寰堝澶存枃浠墮兘鏈変互涓嬬殑緇撴瀯

#ifndef __H
#define __H
#ifdef __cplusplus
extern "C" {
#endif

extern
int f1(int, int);
extern
int f2(int, int);
extern
int f3(int, int);


#ifdef __cplusplus
}
#endif

#endif /*__H*/

濡傛灉鎴戜滑浠垮埗璇ュご鏂囦歡鍙互寰楀埌

#ifndef _C_H_
#define _C_H_
#ifdef __cplusplus
extern "C" {
#endif

extern
int add(int, int);

#ifdef __cplusplus
}
#endif

#endif /* _C_H_ */

榪欐牱緙栬瘧

/*-----------c.c--------------*/
int
add(int x, int y){
return
x+y;
}

榪欐椂婧愭枃浠朵負*.c錛?/font>__cplusplus娌℃湁琚畾涔夛紝extern "C" {}榪欐椂娌℃湁鐢熸晥瀵逛簬C浠栫湅鍒板彧鏄?font color="#990000">extern int add(int, int);
add鍑芥暟緙栬瘧鎴恄add(int, int);

鑰岀紪璇慶++婧愭枃浠?/font>

/*-----------cpp.cpp--------------*/
#include "c.h"
void main()
{

add(1, 0);
}

榪欐椂婧愭枃浠朵負*.cpp,__cplusplus琚畾涔?瀵逛簬C++浠栫湅鍒扮殑鏄?font color="#990000">extern "C" {extern int add(int, int);}緙栬瘧鍣ㄥ氨浼氱煡閬?add(1, 0);璋冪敤鐨凜椋庢牸鐨勫嚱鏁幫紝灝變細鐭ラ亾鍘籧.obj涓壘_add(int, int)鑰屼笉鏄?/strong>add@@YAHHH@Z錛?/font>

榪欎篃灝變負浠涔圖LL涓父鐪嬭extern "C" {}錛?/strong>windows鏄噰鐢–璇█緙栧埗浠栭鍏堣鑰冭檻鍒癈鍙互姝g‘璋冪敤榪欎簺DLL錛岃岀敤鎴峰彲鑳戒細浣跨敤C++鑰?font color="#990000">extern "C" {}灝變細鍙戠敓浣滅敤


RichardHe 2008-07-10 17:27 鍙戣〃璇勮
]]>鎺ㄨ崘--涓板瘜鐨勬父鎴忓紑鍙戠殑绔欑偣http://m.shnenglu.com/richardhe/articles/55714.htmlRichardHeRichardHeWed, 09 Jul 2008 07:11:00 GMThttp://m.shnenglu.com/richardhe/articles/55714.htmlhttp://m.shnenglu.com/richardhe/comments/55714.htmlhttp://m.shnenglu.com/richardhe/articles/55714.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55714.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55714.html
http://www.gameres.com     灞炰簬娓告垙浜虹殑涓枃緗戠粶騫沖彴
http://www.chinagamedev.net    涓浗娓告垙寮鍙戣?br> http://www.gamedevelop.net    涓浗娓告垙寮鍙戞妧鏈祫璁綉 http://www.ogdev.net     涓浗緗戞父鐮斿彂涓績
http://www.chaosstars.com    涓浗娓告垙寮鍙戝熀鍦?br> http://gamedev.91.com    娓告垙鍒朵綔鑱旂洘
http://www.chinadv.com    涓浗鏁扮爜瑙嗛鍦ㄧ嚎
http://www.u9u6.com     u9u6娓告垙緗?br> http://www.amanpage.com    娓告垙寮鍙戠珯鐐?br> http://www.gamecollege.org    娓告垙瀛﹂櫌

鎵嬫満闅忎究鍒楃殑錛?br> http://soft.yesky.com/SoftChannel/72348977504190464/20031215/1753502.shtml Java   鎵嬫満娓告垙寮鍙戜笓杈?br>
鍥藉绔欑偣錛?br> http://www.gdse.com    Game Development Search Engine
http://www.gamedev.net
http://www.igda.org    International Game Developers Association
http://www.gameinstitute.com   Game Institute
http://www.gametutorials.com   Game Tutorials
http://www.sagamedev.co.za    South African Game Development
http://lgdc.sunsite.dk    Linux Game Development Center

涓漢鐨勫強涓撻鐨勶細
http://gd.91.com/zt/ogre/index.asp      OGRE寮曟搸鐮旂┒绔?br> http://www.gameres.com/Topics/Technic/OGRE      OGRE寮曟搸鏁欑▼

RichardHe 2008-07-09 15:11 鍙戣〃璇勮
]]>
鐢˙oost.Spirit鍐欎簡涓涓猼erm涓媍++璇嶆硶楂樹寒http://m.shnenglu.com/richardhe/articles/55612.htmlRichardHeRichardHeTue, 08 Jul 2008 03:49:00 GMThttp://m.shnenglu.com/richardhe/articles/55612.htmlhttp://m.shnenglu.com/richardhe/comments/55612.htmlhttp://m.shnenglu.com/richardhe/articles/55612.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55612.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55612.html

1.1鐗堬紝鍛戒護琛屼笅浣跨敤濡?.0鐗堬紝

    澧炲姞鏇存槗鐢ㄧ殑鏂規硶錛氱偣鍑籧oco.exe錛屽皢鏂囦歡鎷栧叆紿楀彛錛岄珮浜枃浠惰緭鍑哄埌鍚屽悕txt鏂囦歡涓?/font>

    杞垚html鐨勫姛鑳戒互鍚庝笉鎳掔殑鏃跺欏啀鍐欏惂


1.0鐗堬細鍛戒護琛屼笅浣跨敤錛岃緭鍑哄埌stdout錛?/font>

鍙互閲嶅畾鍚戝埌鏂囦歡錛屽僵鑹插鍒跺氨琛屼簡
coco.exe xxx.cpp > whateverfile
璁頒簨鏈墦寮whateverfile錛屽鍒訛紝鍦╞bs涓婂僵鑹茬矘璐?br> 緙栬瘧榪欎釜澶ф闇瑕?鐧懼M鍐呭瓨

鎯崇洿鎺ョ幇鍦ㄧ敤鐨勶紝鍙互鍦ㄨ繖涓嬭澆錛岃繖鏄按鏈ㄧ殑闄勪歡錛屼笉鐭ラ亾鑳芥湁鏁堝埌浠涔堟椂鍊?/font>

http://www.newsmth.net/att.php?p.335.193566.17417.exe

璁哄潧鍙互鐢ㄥ畠鏉ュ疄鐜頒唬鐮侀珮浜樉紺?br> 浠ュ悗鍐嶆敼榪?/font>

姝g‘鐨勪唬鐮乧oco搴旇涓嶄細鍒嗘瀽閿欙紝鑳藉垎鏋愭紜殑涓嶄竴瀹氭槸姝g‘鐨勪唬鐮?/font>

璇諱唬鐮佸彲浠ュ厛鐪媠pirit鏈鍩虹鐨刢h_p,str_p絳夛紝榪樻湁spirit鏂囨。涓殑utility

鍐嶇湅濡備綍鍒嗘瀽鏂囦歡

http://hi.baidu.com/yesbaba/blog/item/091ca995d0fe6e49d1135e8b.html

gnu source highlight灝卞彲浠ュ疄鐜拌繖涓姛鑳戒簡錛屾垜鍋氳繖涓竴鏉ユ槸瀛pirit緇冪粌鎵嬶紝

浜屾潵鏄鍋氫釜璇劇▼璁捐錛屼笁鏉ヨ繖涓緢瀹炵敤錛屽鉤甯稿湪姘存湪甯栦唬鐮佷篃鑳界敤鐨勪笂

///////////////////////////////////////////////////////////////////////////////
//
//       highlight c++ source code in ansi code format
//       COCO (COlorful COde) version 1.1
//       ibe@newsmth.net
//       [ 2007-08-13 ]
//
///////////////////////////////////////////////////////////////////////////////

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/file_iterator.hpp>
#include <boost/spirit/utility/confix.hpp>
#include <boost/spirit/utility/escape_char.hpp>
#include <iostream>
#include <fstream>
///////////////////////////////////////////////////////////////////////////////
using namespace boost::spirit;
using namespace std;

////////////////////////////////////////////////////////////////////////////
//
//       Types
//types needed for file parsing
////////////////////////////////////////////////////////////////////////////
typedef char char_t;
typedef file_iterator < char_t > iterator_t;
typedef scanner < iterator_t > scanner_t;
typedef rule < scanner_t > rule_t;

////////////////////////////////////////////////////////////////////////////
//To ansi錛宎ction鍑芥暟錛屽尮閰嶅悗杈撳嚭鎴恆nsi浠g爜鐨勫僵鑹叉帶鍒剁錛?/font>
//鍙弬鑰冨悇澶ч珮鏍bs鐨刟sciiart鐗堢簿鍗庡尯錛屽彲浠ヨ緭鍑烘垚闇瑕佺殑鏍煎紡錛屽html
//
////////////////////////////////////////////////////////////////////////////
ofstream outfile;
namespace to_ansi
{
  void
   black (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;30m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   red (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;31m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   green (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;32m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   yellow (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;33m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   blue (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;34m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   magenta (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;35m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   cyan (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;36m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   white (iterator_t first, iterator_t const &last)
   {
     outfile << "\033[1;37m";
    while (first != last)
       outfile << *first++;
     outfile << "\033[m";
   }

  void
   echo (iterator_t first, iterator_t const &last)
   {
    while (first != last)
       outfile << *first++;
   }
}
////////////////////////////////////////////////////////////////////////////
//
//       cpp lex
//c++鐨勮瘝娉曟弿榪幫紝鏈変簡comment_p灝辨柟渚垮浜嗭紝璇嗗埆鍑芥暟鍚嶈繕娌″疄鐜?/font>
////////////////////////////////////////////////////////////////////////////
namespace cpp_lex
{
     rule_t comment = comment_p ("/*", "*/")
                     | comment_p ("http://")
                     ;
     rule_t whitespace = space_p
                     ;
     rule_t include = str_p ("#include") >> *space_p >>
                     (comment_p ("<", ">") | comment_p ("\"", "\""))
                     ;
     rule_t preprocessor = (include | "##" | "#define" | "#error" | ("#if" >> space_p)
                         | "#ifdef" | "#ifndef" | "#else" | "#elif"
                         | "#endif" | "#line" | "#pragma" | "#undef" | "#"
                         | "__LINE__" | "__FILE__" | "__DATE__" | "__TIME__"
                         | "_cplusplus" | "__STDC__")
                         >> space_p
                         ;
     rule_t keyword_ = str_p ("asm") | "auto" | "bool" | "break" | "case"
                     | "catch" | "char" | "class" | "const" | "const_cast"
                     | "continue" | "default" | "delete" | "do" | "double"
                     | "dynamic_cast" | "else" | "enum" | "explicit"
                     | "extern" | "false" | "float" | "for" | "friend"
                     | "goto" | "if" | "inline" | "int" | "long" | "mutable"
                     | "namespace" | "new" | "operator" | "private"
                     | "protected" | "public" | "register" | "reinterpret_cast"
                     | "return" | "short" | "signed" | "sizeof" | "static"
                     | "static_cast" | "struct" | "switch" | "template"
                     | "this" | "throw" | "true" | "try" | "typedef" | "typeid"
                     | "typename" | "union" | "unsighed" | "using" | "virtual"
                     | "void" | "volatile" | "wchar_t" | "while"
                     ;
     rule_t keyword = keyword_ >> space_p
                     ;
     rule_t identifer = (alpha_p | '_') >> *(alnum_p | '_')
                     ;
         rule_t operators = punct_p - '`' - '@' - '$' - '\\'
                         ;
     rule_t number = real_p
                     ;
     rule_t str = confix_p ("\"", *c_escape_ch_p, "\"")
                     ;
     rule_t charcter = confix_p("\'", *c_escape_ch_p, "\'")
                     ;
     rule_t constant = number
                     | str
                     | charcter
                     ;

};



////////////////////////////////////////////////////////////////////////////
//
//       Main program
//
////////////////////////////////////////////////////////////////////////////
int
main (int argc, char *argv[])
{
         string filepath;
        if (2 > argc)
         {//鎶婅澶勭悊鐨勬枃浠舵嫋鍒扮獥鍙e唴
                 cout << "drag file to this windows\n";
                 string filepath_input;
                 getline(cin, filepath_input);
                 filepath_input.erase(filepath_input.end()-1); //鍘繪帀緇撳熬鐨?\"'
                 filepath_input.erase(filepath_input.begin());   //鍘繪帀寮澶?
                for (int i = 0; filepath_input[i] != 0; i++) {
                         filepath.push_back(filepath_input[i]);
                        if (filepath_input[i] == '\\')
                                 filepath.push_back('\\');
                 }
         }else{
                // for console usage
                 filepath = argv[1];
         }
         iterator_t first (filepath);
        if (!first)   {
                 std::cerr << "Unable to open file!\n";
                return -1;
         }

        // Create an EOF iterator
         iterator_t last = first.make_end ();

         string filepath_output = filepath+".txt";
         outfile.open(filepath_output.c_str());
        // A simple rule璇嶆硶瀵瑰簲鐨勯鑹插湪榪欓噷鏀瑰氨鍙互
         rule_t r = *(
                 cpp_lex::comment[&to_ansi::cyan]
                 | cpp_lex::constant[&to_ansi::yellow]
                 | cpp_lex::preprocessor[&to_ansi::red]
                 | cpp_lex::keyword[&to_ansi::green]
                 | cpp_lex::whitespace[&to_ansi::echo]
                 | cpp_lex::operators[&to_ansi::magenta]
                 | cpp_lex::identifer[&to_ansi::white]
                 )
                 ;
        //  
        // Parse
        /*The parse_info structure
         The functions above return a parse_info structure parameterized by the iterator type passed in.
         The parse_info struct has these members:parse_info
         stop     Points to the final parse position (i.e The parser recognized and processed the input up to this point)
         hit     True if parsing is successful. This may be full: the parser consumed all the input, or partial: the parser consumed only a portion of the input.
         full     True when we have a full match (i.e The parser consumed all the input).
         length     The number of characters consumed by the parser. This is valid only if we have a successful match (either partial or full).
        */
         parse_info < iterator_t > info = parse (first, last, r);

        // This really shouldn't fail...
        if (info.full)
                 std::cout << "\nParse succeeded!\n";
        else
                 std::cout << "\nParse failed!\n";
        
        std::cout << "highlight file saved in " << filepath_output << endl;
         string end;
         getline (cin, end);//鎸夊洖杞﹂敭鎺ㄥ嚭紿楀彛

        return 0;
}


榪欏彧鏄釜璇嶆硶楂樹寒紼嬪簭錛岃繕涓嶈兘璇嗗埆璇硶錛屽鍑芥暟絳夛紝鐢ㄦ鍒欎篃鑳藉仛錛屼絾boost.spirit鏇寸畝鍗?/font>




RichardHe 2008-07-08 11:49 鍙戣〃璇勮
]]>
鍐呭瓨鍒嗗尯http://m.shnenglu.com/richardhe/articles/55395.htmlRichardHeRichardHeSat, 05 Jul 2008 05:39:00 GMThttp://m.shnenglu.com/richardhe/articles/55395.htmlhttp://m.shnenglu.com/richardhe/comments/55395.htmlhttp://m.shnenglu.com/richardhe/articles/55395.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55395.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55395.html

浜斿ぇ鍐呭瓨鍒嗗尯
    鍦–++涓紝鍐呭瓨鍒嗘垚5涓尯錛屼粬浠垎鍒槸鍫嗐佹爤銆佽嚜鐢卞瓨鍌ㄥ尯銆佸叏灞/闈欐佸瓨鍌ㄥ尯鍜屽父閲忓瓨鍌ㄥ尯銆?br>    鏍堬紝灝辨槸閭d簺鐢辯紪璇戝櫒鍦ㄩ渶瑕佺殑鏃跺欏垎閰嶏紝鍦ㄤ笉闇瑕佺殑鏃跺欒嚜鍔ㄦ竻妤氱殑鍙橀噺鐨勫瓨鍌ㄥ尯銆傞噷闈㈢殑鍙橀噺閫氬父鏄眬閮ㄥ彉閲忋佸嚱鏁板弬鏁扮瓑銆?br>    鍫嗭紝灝辨槸閭d簺鐢眓ew鍒嗛厤鐨勫唴瀛樺潡錛屼粬浠殑閲婃斁緙栬瘧鍣ㄤ笉鍘葷錛岀敱鎴戜滑鐨勫簲鐢ㄧ▼搴忓幓鎺у埗錛屼竴鑸竴涓猲ew灝辮瀵瑰簲涓涓猟elete銆傚鏋滅▼搴忓憳娌℃湁閲婃斁鎺夛紝閭d箞鍦ㄧ▼搴忕粨鏉熷悗錛屾搷浣滅郴緇熶細鑷姩鍥炴敹銆?br>    鑷敱瀛樺偍鍖猴紝灝辨槸閭d簺鐢眒alloc絳夊垎閰嶇殑鍐呭瓨鍧楋紝浠栧拰鍫嗘槸鍗佸垎鐩鎬技鐨勶紝涓嶈繃瀹冩槸鐢╢ree鏉ョ粨鏉熻嚜宸辯殑鐢熷懡鐨勩?br>    鍏ㄥ眬/闈欐佸瓨鍌ㄥ尯錛屽叏灞鍙橀噺鍜岄潤鎬佸彉閲忚鍒嗛厤鍒板悓涓鍧楀唴瀛樹腑錛屽湪浠ュ墠鐨凜璇█涓紝鍏ㄥ眬鍙橀噺鍙堝垎涓哄垵濮嬪寲鐨勫拰鏈垵濮嬪寲鐨勶紝鍦–++閲岄潰娌℃湁榪欎釜鍖哄垎浜嗭紝浠栦滑鍏卞悓鍗犵敤鍚屼竴鍧楀唴瀛樺尯銆?br>    甯擱噺瀛樺偍鍖猴紝榪欐槸涓鍧楁瘮杈冪壒孌婄殑瀛樺偍鍖猴紝浠栦滑閲岄潰瀛樻斁鐨勬槸甯擱噺錛屼笉鍏佽淇敼錛堝綋鐒訛紝浣犺閫氳繃闈炴褰撴墜孌典篃鍙互淇敼錛岃屼笖鏂規硶寰堝錛?br>鏄庣‘鍖哄垎鍫嗕笌鏍?br>    鍦╞bs涓婏紝鍫嗕笌鏍堢殑鍖哄垎闂錛屼技涔庢槸涓涓案鎭掔殑璇濋錛岀敱姝ゅ彲瑙侊紝鍒濆鑰呭姝ゅ線寰鏄販娣嗕笉娓呯殑錛屾墍浠ユ垜鍐沖畾鎷夸粬絎竴涓紑鍒銆?br>    棣栧厛錛屾垜浠婦涓涓緥瀛愶細
    void f() { int* p=new int[5]; }
    榪欐潯鐭煭鐨勪竴鍙ヨ瘽灝卞寘鍚簡鍫嗕笌鏍堬紝鐪嬪埌new錛屾垜浠鍏堝氨搴旇鎯沖埌錛屾垜浠垎閰嶄簡涓鍧楀爢鍐呭瓨錛岄偅涔堟寚閽坧鍛紵浠栧垎閰嶇殑鏄竴鍧楁爤鍐呭瓨錛屾墍浠ヨ繖鍙ヨ瘽鐨勬剰鎬濆氨鏄細 鍦ㄦ爤鍐呭瓨涓瓨鏀句簡涓涓寚鍚戜竴鍧楀爢鍐呭瓨鐨勬寚閽坧銆傚湪紼嬪簭浼氬厛紜畾鍦ㄥ爢涓垎閰嶅唴瀛樼殑澶у皬錛岀劧鍚庤皟鐢╫perator new鍒嗛厤鍐呭瓨錛岀劧鍚庤繑鍥炶繖鍧楀唴瀛樼殑棣栧湴鍧錛屾斁鍏ユ爤涓紝浠栧湪VC6涓嬬殑姹囩紪浠g爜濡備笅錛?br>    00401028   push        14h
    0040102A   call        operator new (00401060)
    0040102F   add         esp,4
    00401032   mov         dword ptr [ebp-8],eax
    00401035   mov         eax,dword ptr [ebp-8]
    00401038   mov         dword ptr [ebp-4],eax
    榪欓噷錛屾垜浠負浜嗙畝鍗曞茍娌℃湁閲婃斁鍐呭瓨錛岄偅涔堣鎬庝箞鍘婚噴鏀懼憿錛熸槸delete p涔堬紵婢籌紝閿欎簡錛屽簲璇ユ槸delete []p錛岃繖鏄負浜嗗憡璇夌紪璇戝櫒錛氭垜鍒犻櫎鐨勬槸涓涓暟緇勶紝VC6灝變細鏍規嵁鐩稿簲鐨凜ookie淇℃伅鍘昏繘琛岄噴鏀懼唴瀛樼殑宸ヤ綔銆?br>    濂戒簡錛屾垜浠洖鍒版垜浠殑涓婚錛氬爢鍜屾爤絀剁珶鏈変粈涔堝尯鍒紵
    涓昏鐨勫尯鍒敱浠ヤ笅鍑犵偣錛?br>    1銆佺鐞嗘柟寮忎笉鍚岋紱
    2銆佺┖闂村ぇ灝忎笉鍚岋紱
    3銆佽兘鍚︿駭鐢熺鐗囦笉鍚岋紱
    4銆佺敓闀挎柟鍚戜笉鍚岋紱
    5銆佸垎閰嶆柟寮忎笉鍚岋紱
    6銆佸垎閰嶆晥鐜囦笉鍚岋紱
    綆$悊鏂瑰紡錛氬浜庢爤鏉ヨ錛屾槸鐢辯紪璇戝櫒鑷姩綆$悊錛屾棤闇鎴戜滑鎵嬪伐鎺у埗錛涘浜庡爢鏉ヨ錛岄噴鏀懼伐浣滅敱紼嬪簭鍛樻帶鍒訛紝瀹規槗浜х敓memory leak銆?br>    絀洪棿澶у皬錛氫竴鑸潵璁插湪32浣嶇郴緇熶笅錛屽爢鍐呭瓨鍙互杈懼埌4G鐨勭┖闂達紝浠庤繖涓搴︽潵鐪嬪爢鍐呭瓨鍑犱箮鏄病鏈変粈涔堥檺鍒剁殑銆備絾鏄浜庢爤鏉ヨ錛屼竴鑸兘鏄湁涓瀹氱殑絀洪棿澶у皬鐨勶紝渚嬪錛屽湪VC6涓嬮潰錛岄粯璁ょ殑鏍堢┖闂村ぇ灝忔槸1M錛堝ソ鍍忔槸錛岃涓嶆竻妤氫簡錛夈傚綋鐒訛紝鎴戜滑鍙互淇敼錛?nbsp;  
    鎵撳紑宸ョ▼錛屼緷嬈℃搷浣滆彍鍗曞涓嬶細Project->Setting->Link錛屽湪Category 涓変腑Output錛岀劧鍚庡湪Reserve涓瀹氬爢鏍堢殑鏈澶у煎拰commit銆?br>娉ㄦ剰錛歳eserve鏈灝忓間負4Byte錛沜ommit鏄繚鐣欏湪铏氭嫙鍐呭瓨鐨勯〉鏂囦歡閲岄潰錛屽畠璁劇疆鐨勮緝澶т細浣挎爤寮杈熻緝澶х殑鍊鹼紝鍙兘澧炲姞鍐呭瓨鐨勫紑閿鍜屽惎鍔ㄦ椂闂淬?br>    紕庣墖闂錛氬浜庡爢鏉ヨ錛岄綣佺殑new/delete鍔垮繀浼氶犳垚鍐呭瓨絀洪棿鐨勪笉榪炵畫錛屼粠鑰岄犳垚澶ч噺鐨勭鐗囷紝浣跨▼搴忔晥鐜囬檷浣庛傚浜庢爤鏉ヨ錛屽垯涓嶄細瀛樺湪榪欎釜闂錛? 鍥犱負鏍堟槸鍏堣繘鍚庡嚭鐨勯槦鍒楋紝浠栦滑鏄姝ょ殑涓涓瀵瑰簲錛屼互鑷充簬姘歌繙閮戒笉鍙兘鏈変竴涓唴瀛樺潡浠庢爤涓棿寮瑰嚭錛屽湪浠栧脊鍑轟箣鍓嶏紝鍦ㄤ粬涓婇潰鐨勫悗榪涚殑鏍堝唴瀹瑰凡緇忚寮瑰嚭錛岃緇嗙殑 鍙互鍙傝冩暟鎹粨鏋勶紝榪欓噷鎴戜滑灝變笉鍐嶄竴涓璁ㄨ浜嗐?br>    鐢熼暱鏂瑰悜錛氬浜庡爢鏉ヨ錛岀敓闀挎柟鍚戞槸鍚戜笂鐨勶紝涔熷氨鏄悜鐫鍐呭瓨鍦板潃澧炲姞鐨勬柟鍚戯紱瀵逛簬鏍堟潵璁詫紝瀹冪殑鐢熼暱鏂瑰悜鏄悜涓嬬殑錛屾槸鍚戠潃鍐呭瓨鍦板潃鍑忓皬鐨勬柟鍚戝闀褲?br>    鍒嗛厤鏂瑰紡錛氬爢閮芥槸鍔ㄦ佸垎閰嶇殑錛屾病鏈夐潤鎬佸垎閰嶇殑鍫嗐傛爤鏈?縐嶅垎閰嶆柟寮忥細闈欐佸垎閰嶅拰鍔ㄦ佸垎閰嶃傞潤鎬佸垎閰嶆槸緙栬瘧鍣ㄥ畬鎴愮殑錛屾瘮濡傚眬閮ㄥ彉閲忕殑鍒嗛厤銆傚姩鎬佸垎閰嶇敱alloca鍑芥暟榪涜鍒嗛厤錛屼絾鏄爤鐨勫姩鎬佸垎閰嶅拰鍫嗘槸涓嶅悓鐨勶紝浠栫殑鍔ㄦ佸垎閰嶆槸鐢辯紪璇戝櫒榪涜閲婃斁錛屾棤闇鎴戜滑鎵嬪伐瀹炵幇銆?br>    鍒嗛厤鏁堢巼錛氭爤鏄満鍣ㄧ郴緇熸彁渚涚殑鏁版嵁緇撴瀯錛岃綆楁満浼氬湪搴曞眰瀵規爤鎻愪緵鏀寔錛氬垎閰嶄笓闂ㄧ殑瀵勫瓨鍣ㄥ瓨鏀炬爤鐨勫湴鍧錛屽帇鏍堝嚭鏍堥兘鏈変笓闂ㄧ殑鎸囦護鎵ц錛岃繖灝卞喅瀹氫簡鏍堢殑鏁堢巼姣? 杈冮珮銆傚爢鍒欐槸C/C++鍑芥暟搴撴彁渚涚殑錛屽畠鐨勬満鍒舵槸寰堝鏉傜殑錛屼緥濡備負浜嗗垎閰嶄竴鍧楀唴瀛橈紝搴撳嚱鏁頒細鎸夌収涓瀹氱殑綆楁硶錛堝叿浣撶殑綆楁硶鍙互鍙傝冩暟鎹粨鏋?鎿嶄綔緋葷粺錛夊湪鍫? 鍐呭瓨涓悳绱㈠彲鐢ㄧ殑瓚沖澶у皬鐨勭┖闂達紝濡傛灉娌℃湁瓚沖澶у皬鐨勭┖闂達紙鍙兘鏄敱浜庡唴瀛樼鐗囧お澶氾級錛屽氨鏈夊彲鑳借皟鐢ㄧ郴緇熷姛鑳藉幓澧炲姞紼嬪簭鏁版嵁孌電殑鍐呭瓨絀洪棿錛岃繖鏍峰氨鏈夋満浼氬垎 鍒拌凍澶熷ぇ灝忕殑鍐呭瓨錛岀劧鍚庤繘琛岃繑鍥炪傛樉鐒訛紝鍫嗙殑鏁堢巼姣旀爤瑕佷綆寰楀銆?br>    浠庤繖閲屾垜浠彲浠ョ湅鍒幫紝鍫嗗拰鏍堢浉姣旓紝鐢變簬澶ч噺new/delete鐨勪嬌鐢紝瀹規槗閫犳垚澶ч噺鐨勫唴瀛樼鐗囷紱鐢變簬娌℃湁涓撻棬鐨勭郴緇熸敮鎸侊紝鏁堢巼寰堜綆錛涚敱浜庡彲鑳藉紩鍙戠敤鎴鋒? 鍜屾牳蹇冩佺殑鍒囨崲錛屽唴瀛樼殑鐢寵錛屼唬浠峰彉寰楁洿鍔犳槀璐點傛墍浠ユ爤鍦ㄧ▼搴忎腑鏄簲鐢ㄦ渶騫挎硾鐨勶紝灝辯畻鏄嚱鏁扮殑璋冪敤涔熷埄鐢ㄦ爤鍘誨畬鎴愶紝鍑芥暟璋冪敤榪囩▼涓殑鍙傛暟錛岃繑鍥炲湴 鍧錛孍BP鍜屽眬閮ㄥ彉閲忛兘閲囩敤鏍堢殑鏂瑰紡瀛樻斁銆傛墍浠ワ紝鎴戜滑鎺ㄨ崘澶у灝介噺鐢ㄦ爤錛岃屼笉鏄敤鍫嗐?br>    铏界劧鏍堟湁濡傛浼楀鐨勫ソ澶勶紝浣嗘槸鐢變簬鍜屽爢鐩告瘮涓嶆槸閭d箞鐏墊椿錛屾湁鏃跺欏垎閰嶅ぇ閲忕殑鍐呭瓨絀洪棿錛岃繕鏄敤鍫嗗ソ涓浜涖?br>    鏃犺鏄爢榪樻槸鏍堬紝閮借闃叉瓚婄晫鐜拌薄鐨勫彂鐢燂紙闄ら潪浣犳槸鏁呮剰浣垮叾瓚婄晫錛夛紝鍥犱負瓚婄晫鐨勭粨鏋滆涔堟槸紼嬪簭宕╂簝錛岃涔堟槸鎽ф瘉紼嬪簭鐨勫爢銆佹爤緇撴瀯錛屼駭鐢熶互鎯充笉鍒扮殑緇撴灉,灝? 綆楁槸鍦ㄤ綘鐨勭▼搴忚繍琛岃繃紼嬩腑錛屾病鏈夊彂鐢熶笂闈㈢殑闂錛屼綘榪樻槸瑕佸皬蹇冿紝璇翠笉瀹氫粈涔堟椂鍊欏氨宕╂帀錛岄偅鏃跺檇ebug鍙槸鐩稿綋鍥伴毦鐨勶細錛?br>    瀵逛簡錛岃繕鏈変竴浠朵簨錛屽鏋滄湁浜烘妸鍫嗘爤鍚堣搗鏉ヨ錛岄偅瀹冪殑鎰忔濇槸鏍堬紝鍙笉鏄爢錛屽懙鍛碉紝娓呮浜嗭紵
static鐢ㄦ潵鎺у埗鍙橀噺鐨勫瓨鍌ㄦ柟寮忓拰鍙鎬?br>       鍑芥暟鍐呴儴瀹氫箟鐨勫彉閲忥紝鍦ㄧ▼搴忔墽琛屽埌瀹冪殑瀹氫箟澶勬椂錛岀紪璇戝櫒涓哄畠鍦ㄦ爤涓婂垎閰嶇┖闂達紝鍑芥暟鍦ㄦ爤涓婂垎閰嶇殑絀洪棿鍦ㄦ鍑芥暟鎵ц緇撴潫鏃朵細閲婃斁鎺夛紝榪欐牱灝變駭鐢熶簡涓涓棶棰? 濡傛灉鎯沖皢鍑芥暟涓鍙橀噺鐨勫間繚瀛樿嚦涓嬩竴嬈¤皟鐢ㄦ椂錛屽浣曞疄鐜幫紵 鏈瀹規槗鎯沖埌鐨勬柟娉曟槸瀹氫箟涓涓叏灞鐨勫彉閲忥紝浣嗗畾涔変負涓涓叏灞鍙橀噺鏈夎澶氱己鐐癸紝鏈鏄庢樉鐨勭己鐐規槸鐮村潖浜嗘鍙橀噺鐨勮闂寖鍥達紙浣垮緱鍦ㄦ鍑芥暟涓畾涔夌殑鍙橀噺錛屼笉浠呬粎鍙楁 鍑芥暟鎺у埗錛夈?/p>

       闇瑕佷竴涓暟鎹璞′負鏁翠釜綾昏岄潪鏌愪釜瀵硅薄鏈嶅姟,鍚屾椂鍙堝姏姹備笉鐮村潖綾葷殑灝佽鎬?鍗寵姹傛鎴愬憳闅愯棌鍦ㄧ被鐨勫唴閮紝瀵瑰涓嶅彲瑙併?/p>

       static鐨勫唴閮ㄦ満鍒訛細
       闈欐佹暟鎹垚鍛樿鍦ㄧ▼搴忎竴寮濮嬭繍琛屾椂灝卞繀欏誨瓨鍦ㄣ傚洜涓哄嚱鏁板湪紼嬪簭榪愯涓璋冪敤錛屾墍浠ラ潤鎬佹暟鎹垚鍛樹笉鑳藉湪浠諱綍鍑芥暟鍐呭垎閰嶇┖闂村拰鍒濆鍖栥?br>       榪欐牱錛屽畠鐨勭┖闂村垎閰嶆湁涓変釜鍙兘鐨勫湴鏂癸紝涓鏄綔涓虹被鐨勫閮ㄦ帴鍙g殑澶存枃浠訛紝閭i噷鏈夌被澹版槑錛涗簩鏄被瀹氫箟鐨勫唴閮ㄥ疄鐜幫紝閭i噷鏈夌被鐨勬垚鍛樺嚱鏁板畾涔夛紱涓夋槸搴旂敤紼嬪簭鐨刴ain錛堬級鍑芥暟鍓嶇殑鍏ㄥ眬鏁版嵁澹版槑鍜屽畾涔夊銆?br>      闈欐佹暟鎹垚鍛樿瀹為檯鍦板垎閰嶇┖闂達紝鏁呬笉鑳藉湪綾葷殑澹版槑涓畾涔夛紙鍙兘澹版槑鏁版嵁鎴愬憳錛夈傜被澹版槑鍙0鏄庝竴涓被鐨?#8220;灝哄鍜岃鏍?#8221;錛屽茍涓嶈繘琛屽疄闄呯殑鍐呭瓨鍒嗛厤錛屾墍浠ュ湪綾誨0 鏄庝腑鍐欐垚瀹氫箟鏄敊璇殑銆傚畠涔熶笉鑳藉湪澶存枃浠朵腑綾誨0鏄庣殑澶栭儴瀹氫箟錛屽洜涓洪偅浼氶犳垚鍦ㄥ涓嬌鐢ㄨ綾葷殑婧愭枃浠朵腑錛屽鍏墮噸澶嶅畾涔夈?br>      static琚紩鍏ヤ互鍛婄煡緙栬瘧鍣紝灝嗗彉閲忓瓨鍌ㄥ湪紼嬪簭鐨勯潤鎬佸瓨鍌ㄥ尯鑰岄潪鏍堜笂絀洪棿錛岄潤鎬?br>鏁版嵁鎴愬憳鎸夊畾涔夊嚭鐜扮殑鍏堝悗欏哄簭渚濇鍒濆鍖栵紝娉ㄦ剰闈欐佹垚鍛樺祵濂楁椂錛岃淇濊瘉鎵宓屽鐨勬垚鍛樺凡緇忓垵濮嬪寲浜嗐傛秷闄ゆ椂鐨勯『搴忔槸鍒濆鍖栫殑鍙嶉『搴忋?/p>

       static鐨勪紭鍔匡細
       鍙互鑺傜渷鍐呭瓨錛屽洜涓哄畠鏄墍鏈夊璞℃墍鍏湁鐨勶紝鍥犳錛屽澶氫釜瀵硅薄鏉ヨ錛岄潤鎬佹暟鎹垚鍛樺彧瀛樺偍涓澶勶紝渚涙墍鏈夊璞″叡鐢ㄣ傞潤鎬佹暟鎹垚鍛樼殑鍊煎姣忎釜瀵硅薄閮芥槸涓鏍鳳紝浣嗗畠鐨? 鍊兼槸鍙互鏇存柊鐨勩傚彧瑕佸闈欐佹暟鎹垚鍛樼殑鍊兼洿鏂頒竴嬈★紝淇濊瘉鎵鏈夊璞″瓨鍙栨洿鏂板悗鐨勭浉鍚岀殑鍊鹼紝榪欐牱鍙互鎻愰珮鏃墮棿鏁堢巼銆?/p>

        寮曠敤闈欐佹暟鎹垚鍛樻椂錛岄噰鐢ㄥ涓嬫牸寮忥細
         <綾誨悕>::<闈欐佹垚鍛樺悕>
    濡傛灉闈欐佹暟鎹垚鍛樼殑璁塊棶鏉冮檺鍏佽鐨勮瘽(鍗硃ublic鐨勬垚鍛?錛屽彲鍦ㄧ▼搴忎腑錛屾寜涓婅堪鏍煎紡
鏉ュ紩鐢ㄩ潤鎬佹暟鎹垚鍛樸?/p>

       PS:
      (1)綾葷殑闈欐佹垚鍛樺嚱鏁版槸灞炰簬鏁翠釜綾昏岄潪綾葷殑瀵硅薄錛屾墍浠ュ畠娌℃湁this鎸囬拡錛岃繖灝卞鑷?br>浜嗗畠浠呰兘璁塊棶綾葷殑闈欐佹暟鎹拰闈欐佹垚鍛樺嚱鏁般?br>      (2)涓嶈兘灝嗛潤鎬佹垚鍛樺嚱鏁板畾涔変負铏氬嚱鏁般?br>      (3)鐢變簬闈欐佹垚鍛樺0鏄庝簬綾諱腑錛屾搷浣滀簬鍏跺錛屾墍浠ュ鍏跺彇鍦板潃鎿嶄綔錛屽氨澶氬皯鏈変簺鐗規畩
錛屽彉閲忓湴鍧鏄寚鍚戝叾鏁版嵁綾誨瀷鐨勬寚閽?錛屽嚱鏁板湴鍧綾誨瀷鏄竴涓?#8220;nonmember鍑芥暟鎸囬拡”銆?/p>       (4)鐢變簬闈欐佹垚鍛樺嚱鏁版病鏈塼his鎸囬拡錛屾墍浠ュ氨宸笉澶氱瓑鍚屼簬nonmember鍑芥暟錛岀粨鏋滃氨
浜х敓浜嗕竴涓剰鎯充笉鍒扮殑濂藉錛氭垚涓轟竴涓猚allback鍑芥暟錛屼嬌寰楁垜浠緱浠ュ皢C++鍜孋-based X W
indow緋葷粺緇撳悎錛屽悓鏃朵篃鎴愬姛鐨勫簲鐢ㄤ簬綰跨▼鍑芥暟韜笂銆?br>      (5)static騫舵病鏈夊鍔犵▼搴忕殑鏃剁┖寮閿錛岀浉鍙嶅ス榪樼緝鐭簡瀛愮被瀵圭埗綾婚潤鎬佹垚鍛樼殑璁塊棶
鏃墮棿錛岃妭鐪佷簡瀛愮被鐨勫唴瀛樼┖闂淬?br>      (6)闈欐佹暟鎹垚鍛樺湪<瀹氫箟鎴栬鏄?gt;鏃跺墠闈㈠姞鍏抽敭瀛梥tatic銆?br>      (7)闈欐佹暟鎹垚鍛樻槸闈欐佸瓨鍌ㄧ殑錛屾墍浠ュ繀欏誨瀹冭繘琛屽垵濮嬪寲銆?br>      (8)闈欐佹垚鍛樺垵濮嬪寲涓庝竴鑸暟鎹垚鍛樺垵濮嬪寲涓嶅悓:
      鍒濆鍖栧湪綾諱綋澶栬繘琛岋紝鑰屽墠闈笉鍔爏tatic錛屼互鍏嶄笌涓鑸潤鎬佸彉閲忔垨瀵硅薄鐩告販娣嗭紱
      鍒濆鍖栨椂涓嶅姞璇ユ垚鍛樼殑璁塊棶鏉冮檺鎺у埗絎rivate錛宲ublic絳夛紱
           鍒濆鍖栨椂浣跨敤浣滅敤鍩熻繍綆楃鏉ユ爣鏄庡畠鎵灞炵被錛?br>           鎵浠ユ垜浠緱鍑洪潤鎬佹暟鎹垚鍛樺垵濮嬪寲鐨勬牸寮忥細
         <鏁版嵁綾誨瀷><綾誨悕>::<闈欐佹暟鎹垚鍛樺悕>=<鍊?gt;
      (9)涓轟簡闃叉鐖剁被鐨勫獎鍝嶏紝鍙互鍦ㄥ瓙綾誨畾涔変竴涓笌鐖剁被鐩稿悓鐨勯潤鎬佸彉閲忥紝浠ュ睆钄界埗綾葷殑褰卞搷銆傝繖閲屾湁涓鐐歸渶瑕佹敞鎰忥細鎴戜滑璇撮潤鎬佹垚鍛樹負鐖剁被鍜屽瓙綾誨叡浜紝浣嗘垜浠湁 閲嶅瀹氫箟浜嗛潤鎬佹垚鍛橈紝榪欎細涓嶄細寮曡搗閿欒鍛紵涓嶄細錛屾垜浠殑緙栬瘧鍣ㄩ噰鐢ㄤ簡涓縐嶇粷濡欑殑鎵嬫硶錛歯ame-mangling 鐢ㄤ互鐢熸垚鍞竴鐨勬爣蹇椼?br>


RichardHe 2008-07-05 13:39 鍙戣〃璇勮
]]>
鍥炶皟鍑芥暟http://m.shnenglu.com/richardhe/articles/55396.htmlRichardHeRichardHeSat, 05 Jul 2008 05:39:00 GMThttp://m.shnenglu.com/richardhe/articles/55396.htmlhttp://m.shnenglu.com/richardhe/comments/55396.htmlhttp://m.shnenglu.com/richardhe/articles/55396.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55396.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55396.html

綆浠?br>
銆銆瀵逛簬寰堝鍒濆鑰呮潵璇達紝寰寰瑙夊緱鍥炶皟鍑芥暟寰堢縐橈紝寰堟兂鐭ラ亾鍥炶皟鍑芥暟鐨勫伐浣滃師鐞嗐傛湰鏂囧皢瑕佽В閲婁粈涔堟槸鍥炶皟鍑芥暟銆佸畠浠湁浠涔堝ソ澶勩佷負浠涔堣浣跨敤瀹冧滑絳夌瓑闂錛屽湪寮濮嬩箣鍓嶏紝鍋囪浣犲凡緇忕啛鐭ヤ簡鍑芥暟鎸囬拡銆?

銆銆浠涔堟槸鍥炶皟鍑芥暟錛?/strong>

銆銆綆鑰岃█涔嬶紝鍥炶皟鍑芥暟灝辨槸涓涓氳繃鍑芥暟鎸囬拡璋冪敤鐨勫嚱鏁般傚鏋滀綘鎶婂嚱鏁扮殑鎸囬拡錛堝湴鍧錛変綔涓哄弬鏁頒紶閫掔粰鍙︿竴涓嚱鏁幫紝褰撹繖涓寚閽堣鐢ㄤ負璋冪敤瀹冩墍鎸囧悜鐨勫嚱鏁版椂錛屾垜浠氨璇磋繖鏄洖璋冨嚱鏁般?br>
銆銆涓轟粈涔堣浣跨敤鍥炶皟鍑芥暟錛?/strong>

銆銆鍥犱負鍙互鎶婅皟鐢ㄨ呬笌琚皟鐢ㄨ呭垎寮銆傝皟鐢ㄨ呬笉鍏沖績璋佹槸琚皟鐢ㄨ咃紝鎵鏈夊畠闇鐭ラ亾鐨勶紝鍙槸瀛樺湪涓涓叿鏈夋煇縐嶇壒瀹氬師鍨嬨佹煇浜涢檺鍒舵潯浠訛紙濡傝繑鍥炲間負int錛夌殑琚皟鐢ㄥ嚱鏁般?br>
濡傛灉鎯崇煡閬撳洖璋冨嚱鏁板湪瀹為檯涓湁浠涔堜綔鐢紝鍏堝亣璁炬湁榪欐牱涓縐嶆儏鍐碉紝鎴戜滑瑕佺紪鍐欎竴涓簱錛屽畠鎻愪緵浜嗘煇浜涙帓搴忕畻娉曠殑瀹炵幇錛屽鍐掓場鎺掑簭銆佸揩閫熸帓搴忋乻hell鎺? 搴忋乻hake鎺掑簭絳夌瓑錛屼絾涓轟嬌搴撴洿鍔犻氱敤錛屼笉鎯沖湪鍑芥暟涓祵鍏ユ帓搴忛昏緫錛岃岃浣跨敤鑰呮潵瀹炵幇鐩稿簲鐨勯昏緫錛涙垨鑰咃紝鎯寵搴撳彲鐢ㄤ簬澶氱鏁版嵁綾誨瀷錛坕nt銆? float銆乻tring錛夛紝姝ゆ椂錛岃鎬庝箞鍔炲憿錛熷彲浠ヤ嬌鐢ㄥ嚱鏁版寚閽堬紝騫惰繘琛屽洖璋冦?br>
銆銆鍥炶皟鍙敤浜庨氱煡鏈哄埗錛屼緥濡傦紝鏈夋椂瑕佸湪紼嬪簭涓緗竴涓? 璁℃椂鍣紝姣忓埌涓瀹氭椂闂達紝紼嬪簭浼氬緱鍒扮浉搴旂殑閫氱煡錛屼絾閫氱煡鏈哄埗鐨勫疄鐜拌呭鎴戜滑鐨勭▼搴忎竴鏃犳墍鐭ャ傝屾鏃訛紝灝遍渶鏈変竴涓壒瀹氬師鍨嬬殑鍑芥暟鎸囬拡錛岀敤榪欎釜鎸囬拡鏉ヨ繘琛屽洖璋冿紝 鏉ラ氱煡鎴戜滑鐨勭▼搴忎簨浠跺凡緇忓彂鐢熴傚疄闄呬笂錛孲etTimer() API浣跨敤浜嗕竴涓洖璋冨嚱鏁版潵閫氱煡璁℃椂鍣紝鑰屼笖錛屼竾涓娌℃湁鎻愪緵鍥炶皟鍑芥暟錛屽畠榪樹細鎶婁竴涓秷鎭彂寰紼嬪簭鐨勬秷鎭槦鍒椼?br>
銆銆鍙︿竴涓嬌鐢ㄥ洖璋冩満鍒剁殑 API鍑芥暟鏄疎numWindow()錛屽畠鏋氫婦灞忓箷涓婃墍鏈夌殑欏跺眰紿楀彛錛屼負姣忎釜紿楀彛璋冪敤涓涓▼搴忔彁渚涚殑鍑芥暟錛屽茍浼犻掔獥鍙g殑澶勭悊紼嬪簭銆傚鏋滆璋冪敤鑰呰繑鍥炰竴涓? 鍊鹼紝灝辯戶緇繘琛岃凱浠o紝鍚﹀垯錛岄鍑恒侲numWindow()騫朵笉鍏沖績琚皟鐢ㄨ呭湪浣曞錛屼篃涓嶅叧蹇冭璋冪敤鑰呯敤瀹冧紶閫掔殑澶勭悊紼嬪簭鍋氫簡浠涔堬紝瀹冨彧鍏沖績榪斿洖鍊鹼紝鍥犱負 鍩轟簬榪斿洖鍊鹼紝瀹冨皢緇х畫鎵ц鎴栭鍑恒?br>
銆銆涓嶇鎬庝箞璇達紝鍥炶皟鍑芥暟鏄戶緇嚜C璇█鐨勶紝鍥犺岋紝鍦–++涓紝搴斿彧鍦ㄤ笌C浠g爜寤虹珛鎺ュ彛錛屾垨涓庡凡鏈夌殑鍥炶皟鎺ュ彛鎵撲氦閬撴椂錛屾墠浣跨敤鍥炶皟鍑芥暟銆傞櫎浜嗕笂榪版儏鍐碉紝鍦–++涓簲浣跨敤铏氭嫙鏂規硶鎴栧嚱鏁扮錛坒unctor錛夛紝鑰屼笉鏄洖璋冨嚱鏁般?br>
銆銆涓涓畝鍗曠殑鍥炶皟鍑芥暟瀹炵幇

涓嬮潰鍒涘緩浜嗕竴涓猻ort.dll鐨勫姩鎬侀摼鎺ュ簱錛屽畠瀵煎嚭浜嗕竴涓悕涓篊ompareFunction鐨勭被鍨?-typedef int (__stdcall *CompareFunction)(const byte*, const byte*)錛屽畠灝辨槸鍥炶皟鍑芥暟鐨勭被鍨嬨傚彟澶栵紝瀹冧篃瀵煎嚭浜嗕袱涓柟娉曪細Bubblesort()鍜孮uicksort()錛岃繖涓や釜鏂規硶鍘熷瀷鐩稿悓錛屼絾瀹炵幇浜嗕笉鍚? 鐨勬帓搴忕畻娉曘?br>
void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc);

void DLLDIR __stdcall Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc);

銆銆榪欎袱涓嚱鏁版帴鍙椾互涓嬪弬鏁幫細

銆銆·byte * array錛氭寚鍚戝厓绱犳暟緇勭殑鎸囬拡錛堜換鎰忕被鍨嬶級銆?br>
銆銆·int size錛氭暟緇勪腑鍏冪礌鐨勪釜鏁般?br>
銆銆·int elem_size錛氭暟緇勪腑涓涓厓绱犵殑澶у皬錛屼互瀛楄妭涓哄崟浣嶃?br>
銆銆·CompareFunction cmpFunc錛氬甫鏈変笂榪板師鍨嬬殑鎸囧悜鍥炶皟鍑芥暟鐨勬寚閽堛?br>
榪欎袱涓嚱鏁扮殑浼氬鏁扮粍榪涜鏌愮鎺掑簭錛屼絾姣忔閮介渶鍐沖畾涓や釜鍏冪礌鍝釜鎺掑湪鍓嶉潰錛岃屽嚱鏁頒腑鏈変竴涓洖璋冨嚱鏁幫紝鍏跺湴鍧鏄綔涓轟竴涓弬鏁頒紶閫掕繘鏉ョ殑銆傚緙栧啓鑰呮潵璇達紝涓? 蹇呬粙鎰忓嚱鏁板湪浣曞瀹炵幇錛屾垨瀹冩庢牱琚疄鐜扮殑錛屾墍闇鍦ㄦ剰鐨勫彧鏄袱涓敤浜庢瘮杈冪殑鍏冪礌鐨勫湴鍧錛屽茍榪斿洖浠ヤ笅鐨勬煇涓鹼紙搴撶殑緙栧啓鑰呭拰浣跨敤鑰呴兘蹇呴』閬靛畧榪欎釜綰﹀畾錛夛細

銆銆·-1錛氬鏋滅涓涓厓绱犺緝灝忥紝閭e畠鍦ㄥ凡鎺掑簭濂界殑鏁扮粍涓紝搴旇鎺掑湪絎簩涓厓绱犲墠闈€?br>
銆銆·0錛氬鏋滀袱涓厓绱犵浉絳夛紝閭d箞瀹冧滑鐨勭浉瀵逛綅緗茍涓嶉噸瑕侊紝鍦ㄥ凡鎺掑簭濂界殑鏁扮粍涓紝璋佸湪鍓嶉潰閮芥棤鎵璋撱?

銆銆·1錛氬鏋滅涓涓厓绱犺緝澶э紝閭e湪宸叉帓搴忓ソ鐨勬暟緇勪腑錛屽畠搴旇鎺掔浜屼釜鍏冪礌鍚庨潰銆?br>
銆銆鍩轟簬浠ヤ笂綰﹀畾錛屽嚱鏁癇ubblesort()鐨勫疄鐜板涓嬶紝Quicksort()灝辯◢寰鏉備竴鐐癸細

void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc)
{
銆for(int i=0; i < size; i++)
銆{
銆銆for(int j=0; j < size-1; j++)
銆銆{
銆銆銆//鍥炶皟姣旇緝鍑芥暟
銆銆銆if(1 == (*cmpFunc)(array+j*elem_size,array+(j+1)*elem_size))
銆銆銆{
銆銆銆銆//涓や釜鐩告瘮杈冪殑鍏冪礌鐩鎬氦鎹?br>銆銆銆銆byte* temp = new byte[elem_size];
銆銆銆銆memcpy(temp, array+j*elem_size, elem_size);
銆銆銆銆memcpy(array+j*elem_size,array+(j+1)*elem_size,elem_size);
銆銆銆銆memcpy(array+(j+1)*elem_size, temp, elem_size);
銆銆銆銆delete [] temp;
銆銆銆}
銆銆}
銆}
}

銆銆娉ㄦ剰錛氬洜涓哄疄鐜頒腑浣跨敤浜唌emcpy()錛屾墍浠ュ嚱鏁板湪浣跨敤鐨勬暟鎹被鍨嬫柟闈紝浼氭湁鎵灞闄愩?br>
銆銆瀵逛嬌鐢ㄨ呮潵璇達紝蹇呴』鏈変竴涓洖璋冨嚱鏁幫紝鍏跺湴鍧瑕佷紶閫掔粰Bubblesort()鍑芥暟銆備笅闈㈡湁浜屼釜綆鍗曠殑紺轟緥錛屼竴涓瘮杈冧袱涓暣鏁幫紝鑰屽彟涓涓瘮杈冧袱涓瓧絎︿覆錛?br>
int __stdcall CompareInts(const byte* velem1, const byte* velem2)
{
銆int elem1 = *(int*)velem1;
銆int elem2 = *(int*)velem2;

銆if(elem1 < elem2)
銆銆return -1;
銆if(elem1 > elem2)
銆銆return 1;

銆return 0;
}

int __stdcall CompareStrings(const byte* velem1, const byte* velem2)
{
銆const char* elem1 = (char*)velem1;
銆const char* elem2 = (char*)velem2;
銆return strcmp(elem1, elem2);
}

銆銆涓嬮潰鍙︽湁涓涓▼搴忥紝鐢ㄤ簬嫻嬭瘯浠ヤ笂鎵鏈夌殑浠g爜錛屽畠浼犻掍簡涓涓湁5涓厓绱犵殑鏁扮粍緇橞ubblesort()鍜孮uicksort()錛屽悓鏃惰繕浼犻掍簡涓涓寚鍚戝洖璋冨嚱鏁扮殑鎸囬拡銆?br>
int main(int argc, char* argv[])
{
銆int i;
銆int array[] = {5432, 4321, 3210, 2109, 1098};

銆cout << "Before sorting ints with Bubblesort\n";
銆for(i=0; i < 5; i++)
銆銆cout << array[i] << '\n';

銆Bubblesort((byte*)array, 5, sizeof(array[0]), &CompareInts);

銆cout << "After the sorting\n";
銆for(i=0; i < 5; i++)
銆銆cout << array[i] << '\n';

銆const char str[5][10] = {"estella","danielle","crissy","bo","angie"};

銆cout << "Before sorting strings with Quicksort\n";
銆for(i=0; i < 5; i++)
銆銆cout << str[i] << '\n';

銆Quicksort((byte*)str, 5, 10, &CompareStrings);

銆cout << "After the sorting\n";
銆for(i=0; i < 5; i++)
銆銆cout << str[i] << '\n';

銆return 0;
}

銆銆濡傛灉鎯寵繘琛岄檷搴忔帓搴忥紙澶у厓绱犲湪鍏堬級錛屽氨鍙渶淇敼鍥炶皟鍑芥暟鐨勪唬鐮侊紝鎴栦嬌鐢ㄥ彟涓涓洖璋冨嚱鏁幫紝榪欐牱緙栫▼璧鋒潵鐏墊椿鎬у氨姣旇緝澶т簡銆?/p>

璋冪敤綰﹀畾

銆銆涓婇潰鐨勪唬鐮佷腑錛屽彲鍦ㄥ嚱鏁板師鍨嬩腑鎵懼埌__stdcall錛屽洜涓哄畠浠ュ弻涓嬪垝綰挎墦澶達紝鎵 浠ュ畠鏄竴涓壒瀹氫簬緙栬瘧鍣ㄧ殑鎵╁睍錛岃鍒板簳涔熷氨鏄井杞殑瀹炵幇銆備換浣曟敮鎸佸紑鍙戝熀浜嶹in32鐨勭▼搴忛兘蹇呴』鏀寔榪欎釜鎵╁睍鎴栧叾絳変環鐗┿備互__stdcall鏍囪瘑鐨勫嚱 鏁頒嬌鐢ㄤ簡鏍囧噯璋冪敤綰﹀畾錛屼負浠涔堝彨鏍囧噯綰﹀畾鍛紝鍥犱負鎵鏈夌殑Win32 API錛堥櫎浜嗕釜鍒帴鍙楀彲鍙樺弬鏁扮殑闄ゅ錛夐兘浣跨敤瀹冦傛爣鍑嗚皟鐢ㄧ害瀹氱殑鍑芥暟鍦ㄥ畠浠繑鍥炲埌璋冪敤鑰呬箣鍓嶏紝閮戒細浠庡爢鏍堜腑縐婚櫎鎺夊弬鏁幫紝榪欎篃鏄疨ascal鐨勬爣鍑嗙害瀹氥備絾 鍦–/C++涓紝璋冪敤綰﹀畾鏄皟鐢ㄨ呰礋璐f竻鐞嗗爢鏍堬紝鑰屼笉鏄璋冪敤鍑芥暟錛涗負寮哄埗鍑芥暟浣跨敤C/C++璋冪敤綰﹀畾錛屽彲浣跨敤__cdecl銆傚彟澶栵紝鍙彉鍙傛暟鍑芥暟涔熶嬌鐢? C/C++璋冪敤綰﹀畾銆?br>
銆銆Windows鎿嶄綔緋葷粺閲囩敤浜嗘爣鍑嗚皟鐢ㄧ害瀹氾紙Pascal綰﹀畾錛夛紝鍥犱負鍏跺彲鍑忓皬浠g爜鐨勪綋縐傝繖鐐瑰鏃╂湡鐨刉indows鏉ヨ闈炲父閲嶈錛屽洜涓洪偅鏃跺畠榪愯鍦ㄥ彧鏈?40KB鍐呭瓨鐨勭數鑴戜笂銆?br>
銆銆濡傛灉浣犱笉鍠滄__stdcall錛岃繕鍙互浣跨敤CALLBACK瀹忥紝瀹冨畾涔夊湪windef.h涓細

#define CALLBACK __stdcallor

#define CALLBACK PASCAL //鑰孭ASCAL鍦ㄦ琚?defined鎴恄_stdcall

銆銆浣滀負鍥炶皟鍑芥暟鐨凜++鏂規硶

銆銆鍥犱負騫蟲椂寰堝彲鑳戒細浣跨敤鍒癈++緙栧啓浠g爜錛屼篃璁鎬細鎯沖埌鎶婂洖璋冨嚱鏁板啓鎴愮被涓殑涓涓柟娉曪紝浣嗗厛鏉ョ湅鐪嬩互涓嬬殑浠g爜錛?br>
class CCallbackTester
{
銆public:
銆int CALLBACK CompareInts(const byte* velem1, const byte* velem2);
};

Bubblesort((byte*)array, 5, sizeof(array[0]),
&CCallbackTester::CompareInts);

銆銆濡傛灉浣跨敤寰蔣鐨勭紪璇戝櫒錛屽皢浼氬緱鍒頒笅闈㈣繖涓紪璇戦敊璇細

error C2664: 'Bubblesort' : cannot convert parameter 4 from 'int (__stdcall CCallbackTester::*)(const unsigned char *,const unsigned char *)' to 'int (__stdcall *)(const unsigned char *,const unsigned char *)' There is no context in which this conversion is possible

銆銆榪欐槸鍥犱負闈為潤鎬佹垚鍛樺嚱鏁版湁涓涓澶栫殑鍙傛暟錛歵his鎸囬拡錛岃繖灝嗚揩浣夸綘鍦ㄦ垚鍛樺嚱鏁板墠闈㈠姞涓妔tatic銆傚綋鐒訛紝榪樻湁鍑犵鏂規硶鍙互瑙e喅榪欎釜闂錛屼絾闄愪簬綃囧箙錛屽氨涓嶅啀璁鴻堪浜嗐?/p>



RichardHe 2008-07-05 13:39 鍙戣〃璇勮
]]>
Boost.Singals 鏁欑▼http://m.shnenglu.com/richardhe/articles/55334.htmlRichardHeRichardHeFri, 04 Jul 2008 05:23:00 GMThttp://m.shnenglu.com/richardhe/articles/55334.htmlhttp://m.shnenglu.com/richardhe/comments/55334.htmlhttp://m.shnenglu.com/richardhe/articles/55334.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55334.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55334.html闃呰鍏ㄦ枃

RichardHe 2008-07-04 13:23 鍙戣〃璇勮
]]>
[鎽樺綍]鍥炶皟鍑芥暟涓庤漿縐昏〃http://m.shnenglu.com/richardhe/articles/55333.htmlRichardHeRichardHeFri, 04 Jul 2008 05:18:00 GMThttp://m.shnenglu.com/richardhe/articles/55333.htmlhttp://m.shnenglu.com/richardhe/comments/55333.htmlhttp://m.shnenglu.com/richardhe/articles/55333.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/55333.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/55333.html

鎽樺綍鑷?銆奀鍜屾寚閽堛?strong>
1.鍥炶皟鍑芥暟

榪欓噷鏈変竴涓畝鍗曠殑鍑芥暟,瀹冪敤浜庡湪涓涓崟閾捐〃涓煡鎵句竴涓?瀹冪殑鍙傛暟鏄竴涓寚鍚戦摼琛ㄧ涓涓妭鐐圭殑鎸囬拡浠ュ強閭d釜闇瑕佹煡鎵劇殑鍊?
Node* search_list(Node* node,int const value)

   while(node!=NULL)
  {  
    if(node->value==value)  break;
    node=node->link;
  }
  return node;
}
 榪? 涓嚱鏁扮湅涓婂幓鐩稿綋綆鍗?浣嗗畠鍙傜敤浜庡間負鏁存暟鐨勯摼琛?濡傛灉浣犻渶瑕佸湪涓涓瓧絎︿覆閾捐〃涓煡鎵?浣犱笉寰椾笉鍙﹀緙栧啓涓涓嚱鏁?榪欎釜鍑芥暟鍜屼笂闈㈤偅涓嚱鏁扮殑緇濆ぇ閮ㄥ垎浠? 鐮佺浉鍚?鍙槸絎簩涓弬鏁扮殑綾誨瀷浠ュ強鑺傜偣鍊肩殑姣旇緝鏂規硶涓嶅悓.涓縐嶆洿涓洪氱敤鐨勬柟娉曟槸鏌ユ壘鍑芥暟涓庣被鍨嬫棤鍏?榪欐牱瀹冨氨鑳界敤浜庝換浣曠被鍨嬬殑鍊肩殑閾捐〃,鎴戜滑蹇呴』瀵瑰嚱鏁扮殑 涓や釜鏂歸潰榪涜淇敼,浣垮畠涓庣被鍨嬫棤鍏?
棣栧厛鎴戜滑蹇呴』鏀瑰彉姣旇緝鐨勬墽琛屾柟寮?榪欐牱鍑芥暟灝卞彲浠ュ浠諱綍綾誨瀷鐨勫艱繘琛屾瘮杈?榪欎釜鐩爣鍚笂鍘誨ソ璞′笉鍙兘,濡傛灉浣? 緙栧啓璇彞鐢ㄤ簬姣旇緝鏁村瀷鍊?瀹冩庝箞榪樺彲鑳界敤浜庡叾浠栫被鍨嬪瀛楃涓茬殑姣旇緝鍛?瑙e喅鏂規灝辨槸浣跨敤鍑芥暟鎸囬拡,璋冪敤鑰呯紪鍐欎竴涓嚱鏁?鐢ㄤ簬姣旇緝涓や釜鍊?鐒跺悗鎶婁竴涓寚鍚戣繖 涓嚱鏁扮殑鎸囬拡浣滀負鍙傛暟浼犻掔粰鏌ユ壘鍑芥暟.鐒跺悗鏌ユ壘鍑芥暟璋冪敤榪欎釜鍑芥暟鏉ユ墽琛屽肩殑姣旇緝,浣跨敤榪欑鏂規硶,浠諱綍綾誨瀷鐨勫奸兘鍙互榪涜姣旇緝.鎴戜滑蹇呴』淇敼鐨勭浜屼釜鏂歸潰鏄? 鍚戝嚱鏁頒紶閫掍竴涓寚鍚戝肩殑鎸囬拡鑰屼笉鏄湰韜?鍑芥暟鐢變竴涓獀oid *褰㈠弬,鐢ㄤ簬鎺ユ敹榪欎釜鍙傛暟,鐒跺悗鎸囧悜榪欎釜鍊肩殑鎸囬拡渚夸紶閫掔粰姣旇緝鍑芥暟,榪欎釜淇敼浣垮瓧絎︿覆鍜屾暟緇勫璞′篃鍙互琚嬌鐢?瀛楃涓插拰鏁扮粍鏃犳硶浣滀負鍙傛暟浼犻掔粰鍑芥暟,浣嗘寚 鍚戝畠浠殑鎸囬拡鍙互.
浣跨敤榪欑鎶宸х殑鍑芥暟鍙?鍥炶皟鍑芥暟"(callback function);鍥犱負鐢ㄦ埛鎶婁竴涓嚱鏁版寚閽堜綔涓哄弬鏁頒紶閫掔粰鍏朵粬鍑芥暟,鍚庤呭皢"鍥炶皟"鐢ㄦ埛鐨勫嚱鏁?浠諱綍鏃跺?濡傛灉浣犳墍緙栧啓鐨勫嚱鏁板繀欏昏兘澶熷湪涓嶅悓鐨勬椂鍒繪墽琛? 涓嶅悓綾誨瀷鐨勫伐浣滄垨鎵ц鍙兘鐢卞嚱鏁拌皟鐢ㄨ呭畾涔夌殑宸ヤ綔,浣犻兘鍙互浣跨敤榪欎釜鎶宸?璁稿紿楀彛緋葷粺浣跨敤鍥炶皟鍑芥暟榪炴帴澶氫釜鍔ㄤ綔,濡傛嫋鎷介紶鏍囧拰鐐瑰嚮鎸夐挳鏉ユ寚瀹氱敤鎴風▼搴忎腑 鐨勬煇涓壒瀹氬嚱鏁?鎴戜滑鏃犳硶鍦ㄨ繖涓笂涓嬫枃鐜涓負鍥炶皟鍑芥暟緙栧啓涓涓噯紜殑鍘熷瀷,鍥犱負鎴戜滑騫朵笉鐭ラ亾榪涜姣旇緝鐨勫肩殑綾誨瀷.浜嬪疄涓?鎴戜滑闇瑕佹煡鎵懼嚱鏁拌兘浣滅敤浜庝換浣? 綾誨瀷鐨勫?瑙e喅榪欎釜闅鵑鐨勬柟娉曟槸鎶婂弬鏁扮被鍨嬪0鏄庝負"void *",琛ㄧず"涓涓寚鍚戞湭鐭ョ被鍨嬬殑鎸囬拡".


/***鍦ㄤ竴涓崟閾捐〃涓煡鎵句竴涓寚瀹氬肩殑鍑芥暟,瀹冪殑鍙傛暟鏄竴涓寚鍚戦摼琛ㄧ涓涓妭鐐?br>   **鐨勬寚閽?涓涓寚鍚戞垜浠渶瑕佹煡鎵劇殑鍊肩殑鎸囬拡鍜屼竴涓嚱鏁版寚閽?瀹冩墍鎸囧悜鐨勫嚱鏁?br>   **鐢ㄤ簬姣旇緝瀛樺偍浜庢閾捐〃涓殑綾誨瀷鐨勫?
*/
#include "node.h"
Node* search_list(Node *node,void  const *value, int(*compare)(void const*,void const*)) //鍑芥暟澹版槑;
{    
  while   (node!=NULL)
  {     
    if(compare(&node->value,value)==0)   break;
    node=node->link;
  }
  return node;
}
鍚屾椂娉ㄦ剰铏界劧鍑芥暟涓嶄細淇敼鍙傛暟node鎵鎸囧悜鐨勪換浣曡妭鐐?浣唍ode騫舵湭澹版槑涓篶onst銆傚鏋渘ode琚0鏄庝負const,鍑芥暟涓嶅緱涓嶈繑鍥炰竴涓猚onst緇撴灉錛岃繖灝嗛檺鍒惰皟鐢ㄧ▼搴忥紝瀹冧究鏃犳硶淇敼鏌ユ壘鍑芥暟鎵鎵懼埌鐨勮妭鐐廣?br> 鍦ㄤ竴涓壒瀹氱殑閾捐〃涓繘琛屾煡鎵炬椂錛岀敤鎴烽渶瑕佺紪鍐欎竴涓傚綋鐨勬瘮杈冨嚱鏁幫紝騫舵妸鎸囧悜璇ュ嚱鏁扮殑鎸囬拡鍜屾寚鍚戦渶瑕佹煡鎵劇殑鍊肩殑鎸囬拡浼犻掔粰鏌ユ壘鍑芥暟銆?br>渚嬪錛屼笅闈㈡槸涓涓瘮杈冨嚱鏁幫紝瀹冪敤浜庡湪涓涓暣鏁伴摼琛ㄤ腑榪涜鏌ユ壘銆?br>int compare_ints(void const* a,void const* b)
{
    if(*(int*)a==*(int*)b)     return 0;
    else     return 1;
}
榪欎釜鍑芥暟灝嗗儚涓嬮潰榪欐牱浣跨敤錛?br>desired_node=search_list(root,&desired_value,compare_ints);

2.杞崲琛紙jump table)
 杞Щ琛ㄦ渶濂界敤涓緥瀛愭潵瑙i噴銆備笅闈㈢殑浠g爜孌靛彇鑷竴涓▼搴忥紝瀹冪敤浜庡疄鐜頒竴涓鐝嶅紡璁$畻鍣ㄣ傜▼搴忕殑鍏朵粬閮ㄥ垎宸茬粡璇誨叆涓や釜鏁幫紙op1鍜宱p2錛夊拰涓涓搷浣滅錛坥per)銆備笅闈㈢殑浠g爜瀵規搷浣滅榪涜嫻嬭瘯錛屾渶鍚庡喅瀹氳皟鐢ㄥ摢涓嚱鏁般?br>switch(oper)
{
  case ADD:   result=add(op1,op2);break;
  case SUB:    result=sub(op1,op2);break;
  case MUL:    result=mul(op1,op2);break;
  case DIV:     result=div(op1,op2);break;
  ......
}

      瀵逛簬涓涓柊濂囩殑鍏鋒湁涓婄櫨涓搷浣滅鐨勮綆楀櫒錛岃繖鏉witch璇彞灝嗕細闈炲父涔嬮暱銆備負浠涔堣璋冪敤鍑芥暟鏉ユ墽琛岃繖浜涙搷浣滃憿錛熸妸鍏蜂綋鎿嶄綔鍜岄夋嫨鎿嶄綔鐨勪唬鐮佸垎寮鏄竴縐? 鑹ソ鐨勮璁℃柟妗堛傛洿涓哄鏉傜殑鎿嶄綔灝嗚偗瀹氫互鐙珛鐨勫嚱鏁版潵瀹炵幇錛屽洜涓哄畠浠殑闀垮害鍙兘寰堥暱銆備絾鍗充嬌鏄畝鍗曠殑鎿嶄綔涔熷彲鑳藉叿鏈夊壇浣滅敤錛屼緥濡備繚瀛樹竴涓父閲忓肩敤浜庝互鍚庣殑 鎿嶄綔銆?br>涓轟簡浣跨敤switch璇彞錛岃〃紺烘搷浣滅鐨勪唬鐮佸繀欏繪槸鏁存暟銆傚鏋滃畠浠槸浠庨浂寮濮嬭繛緇殑鏁存暟錛屾垜浠彲浠ヤ嬌鐢ㄨ漿鎹㈣〃鏉ュ疄鐜扮浉鍚岀殑浠誨姟銆傝漿鎹㈣〃灝辨槸涓涓嚱鏁版寚閽堟暟緇勩?br>鍒涘緩涓涓漿鎹㈣〃闇瑕佷袱涓楠ゃ傞鍏堬紝澹版槑騫跺垵濮嬪寲涓涓嚱鏁版寚閽堟暟緇勩傚敮涓闇瑕佺暀蹇冧箣澶勫氨鏄‘淇濊繖浜涘嚱鏁扮殑鍘熷瀷鍑虹幇鍦ㄨ繖涓暟緇勭殑澹版槑涔嬪墠銆?/p>

double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);

double (*oper_func[])(double,double)={add,sub,mul,div,...}錛?/p>

      鍒濆鍖栧垪琛ㄤ腑鍚勪釜鍑芥暟鍚嶇殑姝g‘欏哄簭鍙栧喅浜庣▼搴忎腑鐢ㄤ簬琛ㄧず姣忎釜鎿嶄綔絎︾殑鏁村瀷浠g爜銆傝繖涓緥瀛愬亣瀹欰DD鏄?錛孲UB鏄?錛孧UL鏄?錛屾帴涓嬪幓浠ユ綾繪帹銆?br>      絎簩涓楠ゆ槸鐢ㄤ笅闈㈣繖鏉¤鍙ユ浛鎹㈠墠闈㈡暣鏉witch璇彞錛?br>result=oper_func[oper](op1,op2);
oper浠庢暟緇勪腑閫夋嫨姝g‘鐨勫嚱鏁版寚閽堬紝鑰屽嚱鏁拌皟鐢ㄦ搷浣滅灝嗘墽琛岃繖涓嚱鏁般?/p>



RichardHe 2008-07-04 13:18 鍙戣〃璇勮
]]>MD5綆楁硶鐨凜++瀹炵幇http://m.shnenglu.com/richardhe/articles/54567.htmlRichardHeRichardHeWed, 25 Jun 2008 09:12:00 GMThttp://m.shnenglu.com/richardhe/articles/54567.htmlhttp://m.shnenglu.com/richardhe/comments/54567.htmlhttp://m.shnenglu.com/richardhe/articles/54567.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/54567.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/54567.html闃呰鍏ㄦ枃

RichardHe 2008-06-25 17:12 鍙戣〃璇勮
]]>
鍩轟簬C++鏈夐檺鐘舵佹満鐨勫疄鐜版妧鏈?璋冩煡鎶ュ憡)http://m.shnenglu.com/richardhe/articles/53134.htmlRichardHeRichardHeFri, 13 Jun 2008 07:01:00 GMThttp://m.shnenglu.com/richardhe/articles/53134.htmlhttp://m.shnenglu.com/richardhe/comments/53134.htmlhttp://m.shnenglu.com/richardhe/articles/53134.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/53134.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/53134.html闃呰鍏ㄦ枃

RichardHe 2008-06-13 15:01 鍙戣〃璇勮
]]>
鏈夐檺鐘舵佹満鐨勫疄鐜?/title><link>http://m.shnenglu.com/richardhe/articles/53131.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Fri, 13 Jun 2008 06:48:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/53131.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/53131.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/53131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/53131.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/53131.html</trackback:ping><description><![CDATA[鏈夐檺鐘舵佹満錛團inite State Machine鎴栬匜inite State Automata)鏄蔣浠墮鍩熶腑涓縐嶉噸瑕佺殑宸ュ叿錛屽緢澶氫笢瑗跨殑妯″瀷瀹為檯涓婂氨鏄湁闄愮姸鎬佹満銆?br><br>鏈榪戠湅浜嗕竴浜涙父鎴忕紪紼婣I鐨勬潗鏂欙紝鎰熻娓告垙涓殑AI錛岀涓瑕佽鐨勫氨鏄湁闄愮姸鎬佹満鏉ュ疄鐜扮簿鐏電殑AI錛岀劧鍚庢墠鏄疉*瀵昏礬錛屽叾浠栧鏈晫璁ㄨ姣旇緝澶氱殑紲炵粡緗戠粶銆佹ā緋婃帶鍒剁瓑闂榪樹笉鏄緢鐑?br><br>FSM鐨勫疄鐜版柟寮忥細<br>1錛?switch/case鎴栬卛f/else<br>榪欐棤鎰忔槸鏈鐩磋鐨勬柟寮忥紝浣跨敤涓鍫嗘潯浠跺垽鏂紝浼氱紪紼嬬殑浜洪兘鍙互鍋氬埌錛屽綆鍗曞皬宸х殑鐘舵佹満鏉ヨ鏈鍚堥傦紝浣嗘槸姣棤鐤戦棶錛岃繖鏍風殑鏂瑰紡姣旇緝鍘熷錛屽搴炲ぇ鐨勭姸鎬佹満闅句互緇存姢銆?br><br>2錛?鐘舵佽〃<br>緇存姢涓涓簩緇寸姸鎬佽〃錛屾í鍧愭爣琛ㄧず褰撳墠鐘舵侊紝綰靛潗鏍囪〃紺鴻緭鍏ワ紝琛ㄤ腑涓涓厓绱犲瓨鍌ㄤ笅涓涓姸鎬佸拰瀵瑰簲鐨勬搷浣溿傝繖涓鎷涙槗浜庣淮鎶わ紝浣嗘槸榪愯鏃墮棿鍜屽瓨鍌ㄧ┖闂寸殑浠d環杈冨ぇ銆?br><br>3錛?浣跨敤State Pattern<br>浣? 鐢⊿tate Pattern浣垮緱浠g爜鐨勭淮鎶ゆ瘮switch/case鏂瑰紡紼嶅ソ錛屾ц兘涓婁篃涓嶄細鏈夊緢澶氱殑褰卞搷錛屼絾鏄篃涓嶆槸100錛呭畬緹庛備笉榪嘡obert C. Martin鍋氫簡涓や釜鑷姩浜х敓FSM浠g爜鐨勫伐鍏鳳紝for java鍜宖or C++鍚勪竴涓紝鍦╤ttp://www.objectmentor.com/resources/index涓婃湁鍏嶈垂涓嬭澆錛岃繖涓伐鍏風殑杈撳叆鏄函鏂囨湰鐨勭姸鎬? 鏈烘弿榪幫紝鑷姩浜х敓絎﹀悎State Pattern鐨勪唬鐮侊紝榪欐牱developer鐨勫伐浣滃彧闇瑕佺淮鎶ょ姸鎬佹満鐨勬枃鏈弿榪幫紝姣忓繀瑕佸啋寮曞叆bug鐨勯闄╁幓緇存姢code銆?br><br>4錛?浣跨敤瀹忓畾涔夋弿榪扮姸鎬佹満<br>涓鑸潵璇達紝C++緙栫▼涓簲璇ラ伩鍏嶄嬌鐢?define錛屼絾鏄繖涓昏鏄洜涓哄鏋滅敤瀹忔潵瀹氫箟鍑芥暟鐨勮瘽錛屽緢瀹規槗浜х敓榪欐牱閭f牱鐨勯棶棰橈紝浣嗘槸宸у鐨勪嬌鐢?榪樻槸鑳藉浜х敓濂囧鐨勬晥鏋溿侻FC灝辨槸浣跨敤瀹忓畾涔夋潵瀹炵幇澶х殑鏋舵瀯鐨勩?br>鍦ㄥ疄鐜癋SM鐨勬椂鍊欙紝鍙互鎶婁竴浜涚箒鐞愭棤姣旂殑if/else榪樻湁鑺辨嫭鍙風殑緇勫悎鏀懼湪瀹忎腑錛岃繖鏍鳳紝鍦ㄤ唬鐮佷腑鍙互3錛変腑鐘舵佹満鎻忚堪鏂囨湰涓鏍峰啓錛岄氳繃緙栬瘧鍣ㄧ殑棰勭紪璇戝鐞嗕駭鐢?錛変竴鏍風殑鏁堟灉錛屾垜瑙佽繃浜х敓C浠g爜鐨勫畯錛屽鏋滆浜х敓C++浠g爜錛屽繁杞疢FC鍙互錛岄偅涔堢悊璁轟笂涔熸槸鍙鐨勩?img src ="http://m.shnenglu.com/richardhe/aggbug/53131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-13 14:48 <a href="http://m.shnenglu.com/richardhe/articles/53131.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍒╃敤C++鏍囧噯搴撲腑鏂囦歡嫻佸璞★紝濡備綍鑾峰緱鏂囦歡鐨勫ぇ灝?/title><link>http://m.shnenglu.com/richardhe/articles/52241.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Thu, 05 Jun 2008 06:17:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/52241.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/52241.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/52241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/52241.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/52241.html</trackback:ping><description><![CDATA[C++鏍囧噯搴撲腑鐨勬枃浠舵祦綾繪彁渚涚殑鍚勭鎿嶄綔涓病鏈夌洿鎺ヨ幏寰楁鍦ㄦ搷浣滅殑鏂囦歡鐨勫ぇ灝忕殑鍑芥暟銆傝鑾峰緱鏂囦歡澶у皬寰楄漿涓集錛岀敤濡備笅鐨勬柟娉?br>    鍋囪鎴戜滑鏈変簡涓涓凡緇忔墦寮鐨勬枃浠跺璞file銆?br>    鍏堝皢鏂囦歡鍐呯殑浣嶇疆鎸囬拡縐誨埌鏂囦歡灝?br>    ifile.seekg( 0, ios::end );<br>    鍐嶈鍙栧綋鍓嶄綅緗紝榪欏氨鏄枃浠剁殑澶у皬浜嗐?br>    long filelength = ifile.tellg();<br>鍑鴻嚜:http://m.shnenglu.com/walkspeed/archive/2007/05/02/23336.html<br><img src ="http://m.shnenglu.com/richardhe/aggbug/52241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-05 14:17 <a href="http://m.shnenglu.com/richardhe/articles/52241.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鎺ュ彛璁捐鐨勮鐐癸紙鎺ュ彛涓嶅簲琚嬌鐢ㄨ呯洿鎺ラ攢姣侊級http://m.shnenglu.com/richardhe/articles/52163.htmlRichardHeRichardHeWed, 04 Jun 2008 07:39:00 GMThttp://m.shnenglu.com/richardhe/articles/52163.htmlhttp://m.shnenglu.com/richardhe/comments/52163.htmlhttp://m.shnenglu.com/richardhe/articles/52163.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52163.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52163.html 鎺ュ彛璁捐鐨勮鐐癸紙鎺ュ彛涓嶅簲琚嬌鐢ㄨ呯洿鎺ラ攢姣侊級 鎺ュ彛鍦ㄤ嬌鐢ㄥ悗錛屼笉闇瑕佷篃涓嶅厑璁哥敤鎴烽攢姣?br>
鎺ュ彛鐢ㄦ潵閫氳鐨勩傝櫧鐒跺湪C++涓紝鎺ュ彛鐨勪竴鑸敤鎸囬拡瀹炵幇錛屼絾瀹冧唬琛ㄧ殑鏄竴縐嶉氳鏂瑰紡錛岃屼笉鏄祫婧愮殑
浣嶇疆銆傝姹傝呭湪浣跨敤瀹屽悗涓嶅簲鍘葷洿鎺ラ攢姣佽繖涓寚閽堬紝鑰屽簲鐢辨帴鍙g殑鎻愪緵鑰呭幓綆$悊銆?br>
鎺ュ彛鐨勬彁渚涜呰綆$悊鎺ュ彛鍏寵仈鐨勫疄浣撶殑鐢熷懡鍛ㄦ湡錛岃屼笖榪樻湁鐭ラ亾鎺ュ彛鐨勪嬌鐢ㄦ儏鍐墊墠鑳界鐞嗘帴鍙c?br>
鎺ュ彛浜庡疄浣撲箣闂存湁鍏寵仈錛岃繖琛ㄦ槑瀹炰綋瑕佸湪鎺ュ彛鍓嶅垱寤猴紝瑕佸湪鎺ュ彛鍚庨攢姣併傝璁′腑鎺ュ彛鎻愪緵鑰呴氳繃鎺ュ彛鐨?br>璁℃暟錛屾潵綆$悊鎺ュ彛鐨勭姸鎬併傛湁涓涓姹傝呭氨灝嗘帴鍙h鏁板鍔犱竴錛屾帴鍙f瘡琚祴鍊間竴嬈℃帴鍙h鏁頒篃澧炲姞涓嬈?br>銆?br>
鎺ュ彛鐨勪嬌鐢ㄨ呭湪浣跨敤瀹屽悗錛岃灝嗘帴鍙h繑鍥炵粰鎺ュ彛鎻愪緵鑰咃紝鑰屼笉鏄嚜宸辯洿鎺ラ攢姣併傚洜涓烘帴鍙d笉鏄浣跨敤鑰?br>鐢寵鐨勮祫婧愶紝鑰屾槸鐢ㄦ埛瑕佹眰鍙︿竴涓璞¢氳鐨勯氶亾銆傛墍浠ョ敤瀹屽悗瑕佽繑榪樼粰鎺ュ彛鎻愪緵鑰呫傛帴鍙f彁渚涜呮瘡鎺?br>鍒頒竴涓帴鍙g殑榪旇繕錛屽氨鍑忓皯榪欎釜鎺ュ彛鐨勮鏁頒竴嬈°?br>
鍦ㄨ閿姣佹帴鍙e叧鑱旂殑瀹炰綋鏃訛紝鍏堣媯鏌ヨ繖涓帴鍙f槸鍚﹁繕鏈変嬌鐢ㄨ咃紝濡傛灉鏈夛紝灝辮閫氱煡浣跨敤鑰咃紝瑕佹眰瀹冧滑
榪旇繕鎺ュ彛銆傚湪鎺ュ彛娌℃湁浣跨敤鑰呯殑鎯呭喌涓嬪父鑳介攢姣佸疄浣擄紙榪欐牱姣旇緝瀹夊叏錛屽綋鐒朵篃鍙互寮鴻閿姣侊級銆?br>
鍚屼竴涓帴鍙e彲鑳藉搴斿涓疄浣擄紝涓嶈繃鐢ㄦ埛鏄劅瑙変笉鍒扮殑銆備絾鏄帴鍙f彁渚涜呬竴瀹氳綆$悊榪欑鎺ュ彛浜庝笉鍚岀殑
瀹炰綋涔嬮棿鐨勫叧鑱斿叧緋伙紝淇濊瘉瀵逛笉鍚岀殑瀹炰綋閿姣佹椂錛岃鏀跺洖涓庤繖涓疄浣撳叧鑱旂殑鎵鏈夋帴鍙c?img src ="http://m.shnenglu.com/richardhe/aggbug/52163.html" width = "1" height = "1" />

RichardHe 2008-06-04 15:39 鍙戣〃璇勮
]]>
鍦–++涓睛嫻嬪唴宓岀被鍨嬬殑瀛樺湪http://m.shnenglu.com/richardhe/articles/52160.htmlRichardHeRichardHeWed, 04 Jun 2008 07:23:00 GMThttp://m.shnenglu.com/richardhe/articles/52160.htmlhttp://m.shnenglu.com/richardhe/comments/52160.htmlhttp://m.shnenglu.com/richardhe/articles/52160.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52160.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52160.html闃呰鍏ㄦ枃

RichardHe 2008-06-04 15:23 鍙戣〃璇勮
]]>
boost婧愮爜鍓栨瀽涔嬶細娉涘瀷緙栫▼綺劇伒type_traitshttp://m.shnenglu.com/richardhe/articles/52159.htmlRichardHeRichardHeWed, 04 Jun 2008 07:22:00 GMThttp://m.shnenglu.com/richardhe/articles/52159.htmlhttp://m.shnenglu.com/richardhe/comments/52159.htmlhttp://m.shnenglu.com/richardhe/articles/52159.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52159.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52159.html闃呰鍏ㄦ枃

RichardHe 2008-06-04 15:22 鍙戣〃璇勮
]]>
boost婧愮爜鍓栨瀽涔嬶細boost::multi_arrayhttp://m.shnenglu.com/richardhe/articles/52157.htmlRichardHeRichardHeWed, 04 Jun 2008 07:21:00 GMThttp://m.shnenglu.com/richardhe/articles/52157.htmlhttp://m.shnenglu.com/richardhe/comments/52157.htmlhttp://m.shnenglu.com/richardhe/articles/52157.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52157.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52157.html闃呰鍏ㄦ枃

RichardHe 2008-06-04 15:21 鍙戣〃璇勮
]]>
boost婧愮爜鍓栨瀽涔嬶細娉涘瀷鎸囬拡綾籥ny涔嬫搗綰崇櫨宸?/title><link>http://m.shnenglu.com/richardhe/articles/52158.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 04 Jun 2008 07:21:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/52158.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/52158.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/52158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/52158.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/52158.html</trackback:ping><description><![CDATA[     鎽樿: 棣栧厛錛宎ny綾婚噷闈竴瀹氳鎻愪緵涓涓ā鏉挎瀯閫犲嚱鏁板拰妯℃澘operator=鎿嶄綔絎︺傚叾嬈★紝鏁版嵁鐨勫瓨鏀句箣鎵鏄釜闂錛屾樉鐒朵綘涓嶈兘灝嗗畠淇濆瓨鍦╝ny綾諱腑錛岄偅浼氬鑷碼ny綾繪垚涓烘ā鏉跨被錛屽悗鑰呮槸鏄庣‘涓嶈鍏佽鐨勩傜粨璁烘槸錛氫負瀹瑰櫒鍑嗗涓涓潪娉涘瀷鐨勫熀綾伙紝鑰岃鎸囬拡鎸囧悜璇ュ熀綾匯?鍔ㄦ満 C++鏄己綾誨瀷璇█錛屾墍鏈夊己綾誨瀷璇█瀵圭被鍨嬬殑瑕佹眰閮芥槸鑻涘埢鐨勶紝綾誨瀷涓鏈変笉鍚堢紪璇戝櫒灝變細鎶辨ㄨ涓嶈兘灝嗘煇鏌愮被鍨嬭漿鎹負鏌愭煇綾誨瀷錛屽綋鐒跺鏋滃湪綾誨瀷涔嬮棿鎻愪緵浜嗚漿鎹?..  <a href='http://m.shnenglu.com/richardhe/articles/52158.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/richardhe/aggbug/52158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-04 15:21 <a href="http://m.shnenglu.com/richardhe/articles/52158.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>boost婧愮爜鍓栨瀽涔嬶細Tuple Typeshttp://m.shnenglu.com/richardhe/articles/52156.htmlRichardHeRichardHeWed, 04 Jun 2008 07:20:00 GMThttp://m.shnenglu.com/richardhe/articles/52156.htmlhttp://m.shnenglu.com/richardhe/comments/52156.htmlhttp://m.shnenglu.com/richardhe/articles/52156.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52156.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52156.html闃呰鍏ㄦ枃

RichardHe 2008-06-04 15:20 鍙戣〃璇勮
]]>
鍒樻湭楣忎箣銆奲oost婧愮爜鍓栨瀽銆嬬郴鍒楀閲嶅洖璋冩満鍒秙ignalhttp://m.shnenglu.com/richardhe/articles/52155.htmlRichardHeRichardHeWed, 04 Jun 2008 07:19:00 GMThttp://m.shnenglu.com/richardhe/articles/52155.htmlhttp://m.shnenglu.com/richardhe/comments/52155.htmlhttp://m.shnenglu.com/richardhe/articles/52155.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52155.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52155.html闃呰鍏ㄦ枃

RichardHe 2008-06-04 15:19 鍙戣〃璇勮
]]>
Boost.Bind鐨勫熀紜浣跨敤http://m.shnenglu.com/richardhe/articles/52150.htmlRichardHeRichardHeWed, 04 Jun 2008 07:01:00 GMThttp://m.shnenglu.com/richardhe/articles/52150.htmlhttp://m.shnenglu.com/richardhe/comments/52150.htmlhttp://m.shnenglu.com/richardhe/articles/52150.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/52150.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/52150.html Boost.Bind鐨勫熀紜浣跨敤 褰撴垜浠嬌鐢ㄥ嚱鏁版椂涔犳儻浜嶤鍑芥暟鐨勬牸寮?鍗沖涓嬪艦寮?br>resulttype funname( arglist );
榪斿洖鍊肩被鍨?鍑芥暟鍚? 鍙傛暟鍒楄〃 );

鍦˙oost.Function涓紝鎴戜滑鍙互鏂逛究鐨勫畾涔夊畾涔夊嚱鏁板璞°備笉榪囧湪瀹氫箟鐢ㄦ潵琛ㄧず綾繪垚鍛樺嚱鏁扮殑鍑芥暟瀵硅薄鏃?br>絎竴涓弬鏁版槸綾繪寚閽堛傝屼笖鍦ㄨ皟鐢ㄦ椂錛岃浼犲叆涓涓被瀹炰緥鐨勬寚閽堛傝繖鏍風敤璧鋒潵騫朵笉鏄緢鏂逛究錛屽洜涓鴻皟鐢ㄨ?br>瑕佺煡閬撶被瀹炰緥銆傝繖瀹為檯涓婃病鏈夊疄鐜拌В鑰︺傝岃В鑰︽槸鎴戜滑浣跨敤鍥炶皟鎴栧鎵樿璁$殑涓涓洰鏍囥?br>
涓轟簡瑙e喅榪欎釜闂錛屾垜浠浣跨敤Boost.Bind搴?br>
Boost.Bind鏄竴涓嚱鏁板璞″伐鍘傘備粬鐢ㄦ潵浜х敓鎴戜滑闇瑕佺殑鍑芥暟瀵硅薄銆傚ソ浜嗭紝鏈変簡瀹冿紝浣犲彲浠ュ湪浣犺璁′腑澶?br>閲忎嬌鐢˙oost.Function銆備笉鐢ㄥ啀鍘誨畾涔夌被鎴愬憳鍑芥暟褰㈠紡鐨勫嚱鏁板璞″暒錛屽彧鐢ㄥ畾涔夋櫘閫氬嚱鏁板璞°?br>
涓涓畝鍗曠殑渚嬪瓙

class CExample
{
public:
    bool printstr( const std::string &str )
    {
        std::cout << "CExample::printstr" << str << std::endl;
        return true;
    }
};

//瀹氫箟涓涓嚱鏁板璞?br>boost::function< bool ( const std::string& ) > printstr;

//鐢˙oost.Bind鍒涘緩涓涓嚱鏁板璞★紝璧嬬粰printstr
CExample example;
printstr = boost::bind( &CExample::printstr, &example, _1 );

濂戒簡錛屾垜浠垱寤轟簡涓涓嚱鏁板璞★紝鑰屼笖璋冪敤鏃朵笉鍐嶉渶瑕佺被瀹炰緥鎷夈傜敤Boost.Function鍜孊oost.Bind澶уぇ
鐨勭畝鍖栦簡Command妯″紡鐨勫疄鐜般?br>
鍦ㄤ笂闈㈢殑渚嬪瓙涓涓彜鎬殑瀵硅薄"_1"銆傝繖涓彨鍋氱珯浣嶇錛屼粬浠h〃榪欎釜浣嶇疆鏈変釜鍙傛暟錛屼絾鐜板湪榪樹笉鐭ラ亾鍙?br>鏁版槸浠涔堛俖1浠h〃鍙傛暟鍒楄〃涓殑絎竴涓綅緗笂鐨勫弬鏁般侭oost.Bind涓鍏卞畾涔変簡9涓珯浣嶇瀵硅薄銆傚涓?br>_1,_2,_3,_4,_5,_6,_7,_8,_9銆傚垎鍒唬琛ㄥ弬鏁板垪琛ㄤ腑浣嶅瓙銆?br>
Boost.Bind浜х敓鐨勫嚱鏁板璞″彲浠ョ洿鎺ヤ嬌鐢紝鍒╃敤涓婇潰鐨勪緥瀛愩?br>
bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );

RichardHe 2008-06-04 15:01 鍙戣〃璇勮
]]>
Boost婧愮爜鍓栨瀽錛欳++娉涘瀷鍑芥暟鎸囬拡綾?/title><link>http://m.shnenglu.com/richardhe/articles/52148.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 04 Jun 2008 06:50:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/52148.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/52148.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/52148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/52148.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/52148.html</trackback:ping><description><![CDATA[<strong>鍓嶅 </strong><br><br>銆銆濡備綘鎵鐭ワ紝Boost搴撴槸涓壒鎬у畬澶囷紝涓斿叿澶囧伐涓氬己搴︾殑搴擄紝浼楀C++鏉冨▉鐨勫弬涓庝嬌鍏惰揪鍒頒簡鐧誨嘲閫犳瀬鐨勭▼搴︺傚挨鍏?a class="bluekey" target="_blank">娉涘瀷</a>鐨勫己澶у▉鍔涘湪鍏朵腑琚彂鎸ュ緱娣嬫紦灝借嚧錛屼護浜虹灎鐩粨鑸屻?br><br>銆銆鐒惰屽急姘翠笁鍗冿紝鎴戜滑鍙彇涓鐡㈤ギ銆備笅闈紝鎴戣瘯鍥句粠鏈鍗曠函鐨勪笘鐣屽紑濮嬶紝涓姝ヤ竴姝ュ甫棰嗕綘榪涘叆<a class="bluekey" target="_blank">婧愮爜</a>鐨勪笘鐣岋紝鍘繪帰絀禸oost::function(涓嬫枃綆縐癴unction)鍐呴儴鐨勭簿寰粨鏋勩?br><br>銆銆閫氬父 錛屽湪鍗曠函鐨勬儏鍐典笅錛屽鍑芥暟鐨?a class="bluekey" target="_blank">璋冪敤</a>綆鍗曡屼笖鐩磋錛屽儚榪欐牱錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>int fun(int someVal);<br><br>int main(){<br>銆fun(10);<br>}</td> </tr> </tbody> </table> <br>銆銆鐒惰屼綘鍙兘闇瑕佸湪鏌愪釜鏃跺埢灝?a class="bluekey" target="_blank">鍑芥暟鎸囬拡</a>淇濆瓨涓嬫潵錛屽茍鍦ㄤ互鍚庣殑鍙︿竴涓椂鍒昏皟鐢ㄥ畠錛屽儚榪欐牱錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>int fun(int);<br><a class="bluekey" target="_blank">typedef</a> int (*func_handle)(int);<br><br>int main(){<br>銆func_handle fh=fun;<br>銆... //do something<br>銆fh(10);<br>}</td> </tr> </tbody> </table> <br>銆銆浣嗘槸錛屽鏋渇un褰㈠紡涓?a class="bluekey" target="_blank">void</a> fun(int)鍛紵濡備綘鎵瑙侊紝fun鍙兘鏈夋棤鏁扮褰㈠紡錛屽鏋滃fun鐨勬瘡涓涓艦寮忛兘typedef涓涓搴旂殑func_handle錛屽垯紼嬪簭鍛樹細鐒﹀ご鐑傞錛屼笉鑳滃叾鎵幫紝浠g爜涔熷彲鑳藉彉寰楄噧鑲垮拰涓戦檵涓嶅牚錛岀敋鑷沖鏋渇un鏄豢鍑芥暟鍛紵<br><br>銆銆騫歌繍鐨勬槸C++娉涘瀷鍙互浣夸唬鐮佸彉寰?a class="bluekey" target="_blank">浼橀泤</a>綺捐嚧錛岄潰瀵規棤鏁扮鐨勫彲鑳斤紝娉涘瀷鏄渶濂界殑閫夋嫨銆?鍥犳錛屼綘鍙槸闇瑕佷竴涓兘澶熶繚瀛樺嚱鏁?a class="bluekey" target="_blank">鎸囬拡</a>鐨勬硾鍨?a class="bluekey" target="_blank">妯℃澘綾?/a>(瀵瑰簲浜嶤ommand妯″紡)錛屽洜涓烘硾鍨?a class="bluekey" target="_blank">緙栫▼</a>鏈変竴涓厛澶╂х殑浼樺娍鈥斺斿彲浠ュ熷姪<a class="bluekey" target="_blank">緙栬瘧鍣?/a>鐨勫姏閲忓湪緙栬瘧鏈熸牴鎹敤鎴鋒彁渚涚殑鍨嬪埆淇℃伅鍖栬韓鍗冧竾(鍏風幇鍖?錛屾墍浠ヤ竴涓硾鍨嬬殑綾誨彲浠ユ湁鏃犻檺涓叿鐜頒綋錛屼篃灝辨槸璇村彲浠ヤ繚瀛樻棤闄愬縐嶅彲鑳藉瀷鍒殑鍑芥暟鎴栫被浼煎嚱鏁扮殑涓滆タ(濡傦紝浠垮嚱鏁?銆傝繖涓被(鍦˙oost搴撲腑鐨勭被鍚嶄負function)涓庡嚱鏁版寚閽堢浉姣斿簲璇ユ湁浠ヤ笅涓浜涗紭鍔匡細<br><br>銆銆¨ 鍚屼竴涓猣unction瀵硅薄搴旇兘澶熸帴鍙椾笌瀹冨艦寮忓吋瀹圭殑鎵鏈夊嚱鏁板拰浠垮嚱鏁?渚嬪錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>int f1(int); //榪欐槸涓嚱鏁幫紝褰㈠紡涓?int(int)<br>short f2(<a class="bluekey" target="_blank">double</a>); //榪欎釜鍑芥暟褰㈠紡涓?short(double)<br><br><a class="bluekey" target="_blank">struct</a> functor //榪欐槸涓豢鍑芥暟綾伙紝褰㈠紡涓篿nt(int)<br>{<br>銆int <a class="bluekey" target="_blank">operator</a>()(int){}<br>};<br><br>functor f3; //鍒涘緩浠垮嚱鏁板璞?br><br>boost::function錛渋nt(int)錛?func; // int(int)鍨嬬殑鍑芥暟鎴栦豢鍑芥暟<br>func = f1; //鎺ュ彈f1<br>func(10); //璋冪敤f1(10)<br>func = f2; //涔熻兘鎺ュ彈short(double)鍨嬬殑f2<br>func(10); //璋冪敤f2(10)<br>func = f3; //涔熻兘鎺ュ彈浠垮嚱鏁癴3<br>func(10); //璋冪敤f3(10)</td> </tr> </tbody> </table> <br>銆銆¨ function搴旇兘澶熷拰鍙傛暟<a class="bluekey" target="_blank">緇戝畾</a>浠ュ強鍏跺畠function-construction搴?a class="bluekey" target="_blank">鍗忓悓宸ヤ綔</a>銆備緥濡傦紝function搴旇涔熻兘澶熸帴鍙梥td::bind1st榪斿洖鐨勪豢鍑芥暟銆傝繖涓鐐瑰叾瀹炵敱絎竴鐐瑰凡緇忔湁鎵淇濊瘉銆?br><br>銆銆¨ 褰撴帴鍙楃殑涓涓┖鐨勪豢鍑芥暟瀵硅薄琚皟鐢ㄧ殑鏃跺檉unction搴旇鏈夊彲棰勬湡鐨勮涓恒?br><br>銆銆鏄劇劧錛岀涓鐐規槸鎴戜滑鐨勯噸鐐癸紝鎵璋撳艦寮忓吋瀹癸紝灝辨槸璇達紝瀵逛簬錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>R1 (T0,<a class="bluekey" target="_blank">T1</a>,T2,...,TN) =錛?FunctionType1<br><a class="bluekey" target="_blank">R2</a> (P0,P1,<a class="bluekey" target="_blank">P2</a>,...,PN) =錛?FunctionType2</td> </tr> </tbody> </table> <br>銆銆涓ょ綾誨瀷鐨勫嚱鏁幫紙騫夸箟錛夛紝鍙婊¤凍錛?br><br>銆銆1. R2鑳藉闅愬紡杞崲涓篟1<br><br>銆銆2. 鎵鏈塗i閮借兘澶熼殣寮忚漿鎹負<a class="bluekey" target="_blank">Pi</a> (i鍙?,1,2,...)<br><br> 閭d箞灝辮錛宐oost::function錛淔unctionType1錛炲彲浠ユ帴鍙桭unctionType2綾誨瀷鐨勫嚱鏁?娉ㄦ剰錛屽弽涔嬩笉琛?銆傛敮鎸佽繖涓 璁烘柇鐨勭悊鐢辨槸錛屽彧瑕乀i鑳藉闅愬紡杞瀷涓篜i錛岄偅涔堝弬鏁拌杞彂緇欑湡瀹炵殑鍑芥暟璋冪敤灝辨槸瀹夊叏鐨勶紝騫朵笖濡傛灉R2鑳藉闅愬紡杞瀷涓篟1錛岄偅涔堣繑鍥炵湡瀹炲嚱鏁拌皟鐢ㄦ墍榪斿洖鐨? 鍊煎氨鏄畨鍏ㄧ殑銆傝繖閲屽畨鍏ㄧ殑鍚箟鏄紝C++綾誨瀷緋葷粺璁や負闅愬紡杞崲涓嶄細涓㈠け淇℃伅錛屾垨鑰呬細緇欏嚭緙栬瘧璀﹀憡錛屼絾鑳藉閫氳繃緙栬瘧銆?br><br>銆銆鍚庨潰浣犱細鐪嬪埌錛宐oost::function閫氳繃鎵璋撶殑invoker闈炲父宸у鍦板疄鐜頒簡榪欑偣錛屽茍涓旈樆姝簡琚艦寮忎笉鍏煎鐨勫嚱鏁拌祴鍊肩殑鎿嶄綔銆?br><strong>鎺㈤櫓</strong><br><br>銆銆濂藉惂錛屽噯澶囧ソ錛屾垜浠鍑哄彂浜嗭紝榪涜娣卞叆婧愮爜涓栫晫鐨勬帰闄┿?br><br>銆銆鍏堢湅涓涓猣unction鐨勬渶綆鍗曠殑浣跨敤錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>int g(int); //涓轟簡璁╀唬鐮佺畝鍗曪紝鍋囪g鏈夊畾涔夛紝浠ュ悗鐨勪唬鐮侀兘浼氬姝?br>function錛渋nt(int)錛?f(g);<br>f(0);</td> </tr> </tbody> </table> <br>銆銆<strong>闂村鈥斺擱(T1,T2,...)鍑芥暟綾誨瀷</strong><br><br>銆銆铏界劧榪欎釜闂村鏈厤鏃╀簡鐐瑰効錛屼絾鏄負浜嗚浣犱互鍚庝笉浼氬甫鐫榪鋒儜錛岃繖鏄劇劧鏄繀瑕佺殑銆傝淇濇寔鑰愬績銆?br><br> 鎴栬浣犱細瀵規ā鏉垮弬鏁癷nt(int)鎰熷埌闄岀敓錛屽叾瀹炲畠鏄釜鍑芥暟鍨嬪埆鈥斺斿嚱鏁癵鐨勭‘鍒囧瀷鍒氨鏄痠nt(int)錛岃屾垜浠氬父鎵鐪嬪埌鐨勫嚱鏁版寚閽堝瀷鍒玦nt (*)(int)鍒欐槸&g鐨勫瀷鍒傚畠浠殑鍖哄埆涓庤仈緋誨湪浜庯細褰撴妸g浣滀負涓涓艱繘琛屾嫹璐濈殑鏃跺欙紙渚嬪錛屾寜鍊間紶鍙傦級錛屽叾綾誨瀷灝變細鐢眎nt(int)閫鍖? 涓篿nt(*)(int)錛屽嵆浠庡嚱鏁扮被鍨嬮鍖栦負鍑芥暟鎸囬拡綾誨瀷鈥斺斿洜涓轟粠璇箟涓婅錛屽嚱鏁頒笉鑳借“鎸夊兼嫹璐?#8221;錛屼絾韜負鍑芥暟鎸囬拡鐨勫湴鍧鍊煎垯鏄彲浠ヨ鎷瘋礉鐨勩傚彟涓 鏂歸潰錛屽鏋済琚粦瀹氬埌寮曠敤錛屽垯鍏剁被鍨嬩笉浼氶鍖栵紝浠嶄繚鎸佸嚱鏁扮被鍨嬨備緥濡傦細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渃lass T錛?br><br>void test_func_type(T ft) //鎸夊間紶閫掞紝綾誨瀷閫鍖?br>{<br>銆static_cast錛渋nt錛?ft); //寮曞彂緙栬瘧閿欒錛屼粠鑰岀湅鍑篺t鐨勭被鍨嬩負閫鍖栧悗鐨勫嚱鏁版寚閽?br>}<br><br>int g(int); //鍑芥暟g錛屽悕瀛梘鐨勭被鍨嬩負int(int)<br>test_func_type(g); //娉ㄦ剰錛屽茍闈?amp;g錛屽弬鏁癵鐨勭被鍨嬪皢浼氶鍖栦負鍑芥暟鎸囬拡綾誨瀷<br>int (&ref_f)(int) = g; //娉ㄦ剰錛屽茍闈?#8220;= &g”錛屽洜涓虹粦瀹氬埌寮曠敤錛岀被鍨嬪茍涓嶉鍖?/td> </tr> </tbody> </table> <br> 褰撶劧錛岃繖鏍風殑浠g爜涓嶈兘閫氳繃緙栬瘧錛屽洜涓簊tatic_cast錛滐紴鏄劇劧涓嶄細璁╀竴涓嚱鏁版寚閽堣漿鎹負int錛岀劧鑰屾垜浠氨鏄瀹冮氫笉榪囩紪璇戯紝榪欐牱鎴戜滑鎵嶈兘紿ヨ鍒? 鎸夊間紶閫掔殑鍙傛暟ft鐨勭被鍨嬪埌搴曟槸浠涔堬紝浠庣紪璇戦敊璇腑鎴戜滑鐪嬪嚭錛宖t鐨勭被鍨嬫槸int(*)(int)錛屼篃灝辨槸璇達紝鍦ㄦ寜鍊間紶閫掔殑榪囩▼涓紝g鐨勭被鍨嬮鍖栦負鍑芥暟鎸? 閽堢被鍨嬶紝鍙樺緱鍜?amp;g鐨勭被鍨嬩竴鏍蜂簡銆傝宺ef_t鐨勭被鍨嬪垯鏄紩鐢紝寮曠敤緇戝畾鍒欐病鏈夊紩璧風被鍨嬮鍖栥?br><br>銆銆璇鋒敞鎰忥紝鍑芥暟綾誨瀷涔冩槸涓瀬鍏剁壒孌婄殑綾誨瀷錛屽湪澶у鏁版椂鍊欏畠閮戒細閫鍖栦負鍑芥暟鎸囬拡綾誨瀷錛屼互渚挎弧瓚蟲嫹璐濊涔夛紝鍙湁闈㈠寮曠敤緇戝畾鐨勬椂鍊欙紝鑳藉緇存寔鍘熸潵鐨勭被鍨嬨傚綋鐒訛紝瀵逛簬boost::function錛屾繪槸鎸夊兼嫹璐濄?br><br>銆銆<strong>緇х畫鏃呯▼</strong><br><br>銆銆濂藉惂錛屽洖榪囩鏉ワ紝鎴戜滑榪樻湁鏇村鍦板甫瑕佸幓鎺㈢┒銆?br><br>銆銆function錛渋nt(int)錛炲疄闄呬笂榪涜浜嗘ā鏉垮亸鐗瑰寲錛孊oost搴撶粰function鐨勭被澹版槑涓猴細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename Signature, //鍑芥暟綾誨瀷<br>typename Allocator = ...<br>錛?//Allocator騫墮潪閲嶇偣錛屾晠涓嶄綔浠嬬粛<br><br>class function;</td> </tr> </tbody> </table> <br>銆銆浜嬪疄涓奻unction綾誨彧鏄釜钖勮杽鐨勫瑕嗭紙wrapper錛夛紝鐪熸璧蜂綔鐢ㄧ殑鏄亸鐗瑰寲鐗堟湰銆?br><br> 瀵逛簬function錛淩(T0)錛炲艦寮忥紝鍋忕壒鍖栫増鏈殑function婧愮爜鍍忚繖鏍?瀹為檯涓婂湪boost婧愪唬鐮佷腑浣犵湅涓嶅埌妯℃澘鍙傛暟T0鐨勫0鏄庯紝涔熺湅涓嶅埌 function1錛屽畠浠瀹忔浛鎹㈡帀浜嗭紝閭d簺綺懼閥鐨勫畯鏄負浜嗗噺灝忓彲瑙佺殑浠g爜閲忥紝鑷充簬瀹冧滑鐨勭粏鑺傚垯鍙堟槸涓涓笘鐣岋紝浠ヤ笅浠g爜鍙湅浣滃灝嗛偅浜涗護浜虹溂鑺辯輯涔辯殑瀹忓睍 寮鍚庢墍寰楀埌鐨勪唬鐮侊紝鍏鋒湁鏇村ソ鐨勫彲璇繪?錛?br><br>銆銆鎽樿嚜錛?#8221;boost/function/function_template.hpp”<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename R,typename T0,typename Allocator錛?br>class function錛淩(T0),Allocator錛?//瀵筊(T0)鍑芥暟綾誨瀷鐨勫亸鐗瑰寲鐗堟湰<br><br>:public function1錛淩,T0,Allocator錛?//涓篟(T0)褰㈠紡鐨勫嚱鏁板噯澶囩殑鍩虹被錛屽湪涓嬮潰璁ㄨ<br>{<br>銆typedef function1錛淩,T0,Allocator錛?base_type;<br>銆typedef function selftype;<br>銆struct clear_type{}; //椹笂浣犱細鐪嬪埌榪欎釜韞婅販鐨勭被鍨嬪畾涔夌殑浣滅敤<br>銆public:<br>銆銆function() : base_type() {} //榛樿鏋勯?br>銆銆template錛渢ypename Functor錛?//妯℃澘鍖栫殑鏋勯犲嚱鏁幫紝涓轟簡鑳藉鎺ュ彈褰㈠紡鍏煎鐨勪豢鍑芥暟瀵硅薄<br>銆銆function(Functor f, typename enable_if錛?br>銆銆銆銆(ice_not錛?is_same錛淔unctor, int錛?:value)錛?:value),<br>銆銆銆銆int<br>銆銆錛?:type = 0) 錛歜ase_type(f){} <br><br>銆function(clear_type*) : base_type() {} //榪欎釜鏋勯犲嚱鏁扮殑浣滅敤鍦ㄤ笅闈㈣В閲?br>銆self_type& operator=(const self_type& f) //鍚岀被鍨媐unction瀵硅薄涔嬮棿搴旇鑳藉璧嬪?br>銆{<br>銆銆self_type(f).swap(*this); //swap鎶宸э紝緇嗚妭瑙併奅ffective STL銆?br>銆銆return *this;<br>銆}<br>銆...<br>};<br><br>enable_if<br></td> </tr> </tbody> </table> <br>銆銆浣犱竴瀹氬妯℃澘鏋勯犲嚱鏁頒腑鍑虹幇鐨勯偅涓啑闀跨殑enable_if錛?..錛炵殑浣滅敤蹇冨瓨鐤戞儜錛屽叾瀹炲畠鐨勪綔鐢ㄨ絀夸簡寰堢畝鍗曪紝灝辨槸錛氬綋鐢ㄦ埛鏋勯狅細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>function錛渋nt(int)錛?f(0);</td> </tr> </tbody> </table> <br>銆銆鐨勬椂鍊欙紝灝嗚錛堝甫鏈塭nable_if鐨勶級鏋勯犲嚱鏁頒粠閲嶈澆鍐寵鐨勫欓夐泦涓涪鎺夈備嬌閲嶈澆鍐寵鐨勭粨鏋滀負閫変腑絎笁涓瀯閫犲嚱鏁幫細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>function(clear_type*):base_type(){}</td> </tr> </tbody> </table> <br>銆銆浠? 鑰岃繘琛岀己鐪佹瀯閫犮? 鑰岃寰楀啑闀夸竴鐐瑰氨鏄細褰揻鐨勭被鍨嬧斺擣unctor鈥斺斾笉鏄痠nt鏃訛紝璇ユ瀯閫犲嚱鏁板氨鏄?#8220;鏈夋晥錛坋nable錛?#8221;鐨勶紝浼氳閲嶈澆鍐寵閫変腑銆備絾濡傛灉鐢ㄦ埛鎻愪緵浜嗕竴 涓?錛岀敤鎰忔槸鏋勯犱竴涓┖(null)鐨勫嚱鏁版寚閽堬紝閭d箞璇ュ嚱鏁板氨浼氱敱浜?#8220;SFINAE”鍘熷垯鑰岃浠庨噸杞藉喅璁殑鍊欓夊嚱鏁頒腑韙㈡帀銆備負浠涔堣榪欐牱鍛紵鍥犱負璇ユ瀯閫犲嚱 鏁拌礋璐f妸紜垏鐨刦淇濆瓨璧鋒潵錛屽畠鍋囧畾f騫墮潪0銆傞偅搴旇閫夋嫨璋佸憿錛熺涓変釜鏋勯犲嚱鏁幫紒鍏跺弬鏁扮被鍨嬫槸clear_type*錛屽綋鐒訛紝0鍙互琚祴緇欎換浣曟寚閽堬紝鎵浠ュ畠 琚夊嚭錛屾墽琛岀己鐪佺殑鏋勯犺涓恒?br><strong>鍩虹被 functionN</strong><br><br>銆銆function鐨勯鏋跺氨榪欎簺銆備篃璁鎬綘浼氶棶錛宖unction浣滀負涓涓豢鍑芥暟綾伙紝鎬庝箞娌℃湁閲? 杞給perator()鈥斺旇繖鍙槸韜負浠垮嚱鏁扮殑鏍囧織鍟婏紒鍒ワ紝function鎶婅繖浜涚儲浜虹殑浠誨姟閮戒涪緇欎簡瀹冪殑鍩虹被functionN錛屾牴鎹儏鍐典笉鍚岋紝N鍙? 鑳戒負0錛?錛?...錛岃鍏蜂綋涓鐐瑰氨鏄細鏍規嵁鐢ㄦ埛浣跨敤function鏃剁粰鍑虹殑鍑芥暟綾誨瀷錛宖unction灝嗕細緇ф壙鑷笉鍚岀殑鍩虹被鈥斺斿鏋滅敤鎴風粰鍑虹殑鍑芥暟綾? 鍨嬩負“R()”褰㈠紡鐨勶紝鍗充粎鏈変竴涓弬鏁幫紝鍒檉unction緇ф壙鑷猣unction0錛岃屽浜嶳(T0)褰㈠紡鐨勫嚱鏁扮被鍨嬶紝鍒欑戶鎵胯嚜function1錛屼緷 姝ょ被鎺ㄣ傚墠闈㈣榪囷紝function鍙槸涓灞傚瑕嗭紝鑰屾墍鏈夌殑縐樺瘑閮藉湪鍏跺熀綾籪unctionN涓紒<br><br>銆銆涓嶇煡閬撲綘鏈夋病鏈夊彂鐜幫紝function鐨勯鏋朵腑涔熷嚑涔庢病鏈夌敤鍒板嚱鏁扮被鍨嬬殑淇℃伅錛屼簨瀹炰笂錛屽畠涔熷皢榪欎簺淇℃伅涓鑲¤剳鍎挎姏緇欎簡鍩虹被銆傚湪榪欒繃紼嬩腑錛屾販娌屼竴鍥㈢殑int(int)鍨嬪埆琚媶瑙d負涓や釜鍗曠嫭鐨勬ā鏉垮弬鏁頒紶緇欏熀綾?<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename R,typename T0,typename Allocator錛?br>class function錛淩(T0),Allocator錛?//R(T0)鏁翠釜涓轟竴鍨嬪埆<br>:public function1錛淩,T0,Allocator錛?//鎷嗚В涓轟袱涓ā鏉垮弬鏁癛,T0浼犵粰鍩虹被</td> </tr> </tbody> </table> <br>銆銆濂戒簡錛屼笅闈㈡垜浠繁鍏ュ熀綾籪unction1銆傜湡姝d赴瀵岀殑瀹濊棌鍦ㄩ噷闈€?br><br>銆銆function1<br><br>銆銆function1鐨勬簮浠g爜鍍忚繖鏍?涓庝笂闈竴鏍鳳紝浜嬪疄涓婃湁浜涗唬鐮佷綘鏄湅涓嶅埌鐨勶紝涓轟簡涓嶈浣犺糠鎯戯紝鎴戠粰鍑虹殑鏄皢瀹忓睍寮鍚庡緱鍒扮殑浠g爜):<br><br>銆銆鎽樿嚜錛?#8221;boost/function/function_template.hpp”<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename R,typename T0,class Allocator = ...錛?br><br>class function1:public function_base //function_base璐熻矗綆$悊鍐呭瓨<br>{<br>銆...<br>銆public:<br>銆銆typedef R result_type; //榪斿洖綾誨瀷<br>銆銆typedef function1 self_type;<br>銆銆function1() : function_base(),invoker(0){}//榛樿鏋勯?br>銆銆template錛渢ypename Functor錛?br>銆銆function1(Functor const & f, //妯℃澘鏋勯犲嚱鏁?br>銆銆銆typename enable_if錛?..錛?:type = 0) : <br>銆銆銆function_base(),<br>銆銆銆invoker(0)<br>銆銆銆{<br>銆銆銆銆this-錛瀉ssign_to(f); //榪欏効鐪熸榪涜璧嬪鹼紝assign_to鐨勪唬鐮佸湪涓嬮潰鍒楀嚭<br>銆銆銆}<br><br>銆銆function1(clear_type*) : function_base(), invoker(0){} //璇ユ瀯閫犲嚱鏁頒笂闈㈣В閲婅繃<br>銆銆function1(const function& f) : //鎷瘋礉鏋勯犲嚱鏁?br>銆銆function_base(),<br>銆銆invoker(0){<br>銆銆銆this-錛瀉ssign_to_own(f); //涓撶敤浜庡湪function涔嬮棿璧嬪肩殑assignment<br>銆銆}<br><br>銆銆result_type operator()(T0 a0) const //韜負浠垮嚱鏁扮殑鏍囧織錛?br>銆銆{<br>銆銆銆//涓嬮潰璐熻矗璋冪敤鎸囧悜鐨勫嚱鏁?br><br>銆銆銆if (this-錛瀍mpty())<br>銆銆銆銆boost::throw_exception(bad_function_call());<br>銆銆銆銆//榪欓噷榪涜鐪熸鐨勫嚱鏁拌皟鐢紝浣跨敤invoker<br><br>銆銆銆銆internal_result_type result = invoker(function_base::functor,a0); <br>銆銆銆銆return static_cast錛渞esult_type錛?result);<br>銆銆}<br><br>銆銆template錛渢ypename Functor錛?br>銆銆void assign_to(Functor f) //鎵鏈夌殑鏋勯犲嚱鏁伴兘璋冪敤瀹冿紒鍏鋒湁澶氫釜閲嶈澆鐗堟湰銆?br>銆銆{<br>銆銆銆//浠ヤ竴涓猤et_function_tag钀冨彇鍑篎unctor鐨勭被鍒?category)!<br>銆銆銆typedef typename detail::function::get_function_tag錛淔unctor錛?:type tag;<br>銆銆銆this-錛瀉ssign_to(f, tag());//鏍規嵁涓嶅悓綾誨埆鐨凢unctor閲囧彇涓嶅悓鐨刟ssign絳栫暐錛?br>銆銆}</td> </tr> </tbody> </table> <br>銆銆get_function_tag錛滐紴鑳借悆鍙栧嚭Functor鐨勭被鍒?category)錛屾湁涓嬮潰鍑犵綾誨埆<br><br>銆銆struct function_ptr_tag {}; //鍑芥暟鎸囬拡綾誨埆<br><br>銆銆struct function_obj_tag {}; //浠垮嚱鏁板璞$被鍒?br><br>銆銆struct member_ptr_tag {}; //鎴愬憳鍑芥暟綾誨埆<br><br>銆銆struct function_obj_ref_tag {};//浠ef(obj)鍔犱互灝佽鐨勭被鍒紝鍏鋒湁寮曠敤璇箟<br><br>銆銆struct stateless_function_obj_tag {}; //鏃犵姸鎬佸嚱鏁板璞?br><br>銆銆婊¤凍浠ヤ笅鎵鏈夋潯浠訛細<br><br>銆銆has_trivial_constructor<br><br>銆銆has_trivial_copy<br><br>銆銆has_trivial_destructor<br><br>銆銆is_empty<br><br>銆銆鐨勪豢鍑芥暟瀵硅薄縐頒負stateless鐨?br><br>銆銆鑰屽浜庝笉鍚岀殑鍑芥暟綾誨埆錛宎ssign_to鏈夊悇涓笉鍚岀殑閲嶈澆鐗堟湰錛屽涓嬶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename FunctionPtr錛?//濡傛灉鏄嚱鏁版寚閽堝氨璋冪敤榪欎釜鐗堟湰<br><br>void assign_to(FunctionPtr f, function_ptr_tag) //榪欎釜鐗堟湰閽堝鍑芥暟鎸囬拡<br>{ <br>銆clear();<br>銆if (f){<br>銆銆typedef typename detail::function::get_function_invoker1錛淔unctionPtr,R,T0錛?:type invoker_type;<br>銆銆invoker = &invoker_type::invoke; //invoke鏄痵tatic鎴愬憳鍑芥暟<br><br>銆銆function_base::manager = //綆$悊絳栫暐<br>銆銆銆銆 &detail::function::functor_manager錛淔unctionPtr, Allocator錛?:manage;<br><br>銆銆function_base::functor = //浜ょ粰function鐨勫嚱鏁版寚閽堟垨浠垮嚱鏁板璞℃寚閽堟渶緇堝湪榪欏効淇濆瓨<br>銆銆銆function_base::manager(<br>銆銆銆銆detail::function::make_any_pointer((void (*)())(f)),<br>銆銆銆銆detail::function::clone_functor_tag);//瀹為檯涓婃嫹璐濅簡涓浠藉嚱鏁版寚閽?br>銆}<br>}<br><br>...<br><br>typedef internal_result_type (*invoker_type)(detail::function::any_pointer,T0);<br>invoker_type invoker; //閲嶈鎴愬憳錛岃礋璐h皟鐢ㄥ嚱鏁幫紒<br><br>};</td> </tr> </tbody> </table> <br>銆銆浣犲彲鑳藉凡緇忚榪欐“澶瑰彊澶硅”鐨勪唬鐮佸紕寰楀ご鏄忚剳娑ㄤ簡錛屼絾榪欐墠鍒氬垰寮濮嬶紒<br><br>銆銆<strong>function鐨勫簳灞傚瓨鍌ㄦ満鍒?/strong><br><br>銆銆璇峰皢鐩厜杞悜涓婇潰鐨勪唬鐮佹鏈熬鐨刟ssign_to鍑芥暟涓紝鍏朵腑鏈変袱琛屾繁鑹茬殑浠g爜錛屽垎鍒function_base閲岀殑manager鍜宖unctor鎴愬憳璧嬪箋傝繖涓よ浠g爜鑲╄礋浜嗕繚瀛樺悇縐嶅嚱鏁版寚閽堢殑浠誨姟銆?br><br> manager鏄竴涓嚱鏁版寚閽堬紝瀹冩墍鎸囧悜鐨勫嚱鏁頒唬琛ㄧ鐞嗙瓥鐣ワ紝渚嬪錛屽浜庡嚱鏁版寚閽堬紝浠呬粎浣滀竴嬈¤祴鍊鹼紝灝變繚瀛樺畬姣曚簡錛屼絾鏄浜庝豢鍑芥暟錛屽緱棰濆鍒嗛厤涓嬈″唴 瀛橈紝鐒跺悗灝嗕豢鍑芥暟鎷瘋礉鍒板垎閰嶇殑鍐呭瓨涓紝榪欐墠瀹屾垚浜嗕繚瀛樼殑浠誨姟銆傝繖浜涚瓥鐣ユ牴鎹嚱鏁扮殑綾誨埆鑰屽畾錛屼笂闈唬鐮佷腑鐨刟ssign_to鍑芥暟鏄拡瀵瑰嚱鏁版寚閽堢被鍒殑閲嶈澆 鐗堟湰錛屾墍浠anager鐨勭瓥鐣ユ槸涓嶄綔浠諱綍鍐呭瓨鍒嗛厤錛岀洿鎺ヨ繑鍥炶杞瀷涓?#8220;void(*)()”錛堝埄浜庡湪搴曞眰浠ョ粺涓鐨勫艦寮忎繚瀛橈級鐨勫嚱鏁版寚閽堝氨琛屼簡錛岃繖浠庝唬鐮? 涓彲浠ョ湅鍑恒?br><br>銆銆闇瑕佽鏄庣殑鏄紝瀵逛簬鍑芥暟鎸囬拡錛宖unction_base騫朵笉鐭ラ亾涔熶笉鍏沖績瀹冭淇濆瓨鐨勫嚱鏁版寚閽堟槸浠涔堢‘鍒囩殑綾誨瀷錛屽彧瑕佹槸 鍑芥暟鎸囬拡灝辮錛屽洜涓哄畠鎬諱細鎶婅鍑芥暟鎸囬拡f杞瀷涓?#8220;void (*)()”綾誨瀷錛岀劧鍚庝繚瀛樺湪functor鎴愬憳涓紝functor鎴愬憳鏄竴涓猽nion:<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>union any_pointer<br>{<br>void* obj_ptr; //浠繪剰浠垮嚱鏁板璞℃寚閽堥兘鍙互鐢╯tatic_cast錛滐紴杞瀷涓簐oid*鍨?br>const void* const_obj_ptr; //涓篶onst浠垮嚱鏁板噯澶囩殑<br>void (*func_ptr)(); //浠繪剰鍑芥暟鎸囬拡閮藉彲浠ョ敤reinterpret_cast錛滐紴杞瀷涓簐oid(*)()鍨?br>char data[1];<br>};</td> </tr> </tbody> </table> <br>銆銆榪欎釜any_pointer鍙互閫氳繃瀹夊叏杞瀷淇濆瓨鎵鏈夊艦寮忕殑浠垮嚱鏁板拰鍑芥暟鎸囬拡錛屾壙杞藉湪搴曞眰淇濆瓨鏁版嵁鐨勪換鍔?br><br>銆銆<strong>function鐨勮皟鐢ㄦ満鍒垛斺攊nvoker</strong><br><br>銆銆鎴戜滑鎶婄洰鍏夎漿鍒癴unction1鐨勫畾涔夌殑鏈搴曢儴錛岄偅鍎垮畾涔変簡瀹冩渶閲嶈鐨勬垚鍛榠nvoker錛屽畠鏄竴涓嚱鏁版寚閽堬紝鎵鎸囧悜鐨勫嚱鏁板氨鏄痜unction鐨勮皟鐢ㄦ満鍒舵墍鍦紝invoker鐨勭被鍨嬩負錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>typedef internal_result_type (*invoker_type)(any_pointer,T0);</td> </tr> </tbody> </table> <br> 鍓嶉潰宸茬粡璇磋繃錛宎ny_pointer鏄釜union錛屽彲浠ヤ繚瀛樹換浣曠被鍨嬬殑鍑芥暟鎸囬拡鎴栧嚱鏁板璞★紝閲岄潰淇濆瓨鐨勬槸鐢ㄦ埛娉ㄥ唽鐨勫嚱鏁版垨浠垮嚱鏁幫紝T0涓鴻皟鐢? any_pointer涓殑鍑芥暟鐨勫弬鏁扮殑鍨嬪埆錛堝浜庝笉鍚屾儏鍐碉紝鍙兘浼氭湁T1,T2絳夛級銆傝繖涔熷氨鏄錛宨nvoker璐熻矗璋冪敤淇濆瓨鍦╝ny_pointer 涓殑鐢ㄦ埛鎻愪緵鐨勫嚱鏁版垨浠垮嚱鏁般?br><br>銆銆閭d箞錛宨nvoker榪欎釜鍑芥暟鎸囬拡鍒板簳鎸囧悜浠涔堝嚱鏁板憿鈥斺斾篃灝辨槸璇達紝鍦ㄤ粈涔堟椂鍊檌nvoker琚祴鍊間簡鍛紵鎴戜滑鍐嶆鎶婄洰鍏夎漿鍚慳ssign_to鍑芥暟錛屽叾涓湁涓琛屽invoker鎴愬憳璧嬪肩殑璇彞錛屼粠榪欒璇彞鍑哄彂鎴戜滑鍙互鎻湶invoker鐨勫叏閮ㄥゥ縐橈細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>invoker = &invoker_type::invoke; //invoke鏄痵tatic鎴愬憳鍑芥暟</td> </tr> </tbody> </table> <br> 璇蜂笉瑕佹妸榪欎釜invoker_type鍜屼笂闈㈤偅涓嚱鏁版寚閽堝瀷鍒玦nvoker_type娣鋒穯璧鋒潵錛岃繖涓猧nvoker_type鏄綅浜? assign_to鍑芥暟涓殑涓涓眬閮ㄧ殑typedef錛屾墍浠ラ殣钘忎簡鍚庤咃紙鍗崇被浣滅敤鍩熶腑鐨勯偅涓猧nvoker_type鈥斺攊nvoker鎴愬憳鐨勭被鍨嬶級銆傚線 涓婁竴琛岋紝浣犲氨鐪嬪埌榪欎釜灞閮ㄥ瀷鍒玦nvoker_type鐨勫畾涔変簡錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>typedef typename get_function_invoker1錛?br><br>FunctionPtr,R,T0錛?:type invoker_type;</td> </tr> </tbody> </table> <br>銆銆get_function_invoker1鍙堟槸浣曠墿錛熷緢鏄劇劧錛岃繖鏄釜traits錛屽叾鍐呭祵鐨?:type浼氭牴鎹笉鍚岀殑妯℃澘鍙傛暟琛ㄧ幇涓轟笉鍚岀殑綾誨瀷錛屽湪鏈緥涓紝::type鐨勭被鍨嬪皢浼氳鎺ㄥ涓?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>function_invoker1錛渋nt(*)(int),int,int錛?/td> </tr> </tbody> </table> <br>銆銆鑰宖unction_invoker1鏄釜綾繪ā鏉匡紝鍏跺畾涔変負錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename FunctionPtr,<br>typename R錛宼ypename T0錛?//娉ㄦ剰榪欓噷鐨勬ā鏉垮弬鏁幫紝鍚庨潰浼氳В閲?br><br>struct function_invoker1<br>{<br>銆static R invoke(any_pointer function_ptr,T0 a0)<br>銆{<br>銆銆FunctionPtr f = reinterpret_cast錛淔unctionPtr錛?function_ptr.func_ptr);<br>銆銆return f(a0);<br>銆}<br>};</td> </tr> </tbody> </table> <br>銆銆鎵浠ュinvoker鐨勮祴鍊兼渶緇堢浉褰撲簬錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>invoker=&function_invoker1錛渋nt(*)(int),int,int錛?:invoke;</td> </tr> </tbody> </table> <br>銆銆鑰宖unction_invoker1錛渋nt(*)(int),int,int錛?:invoke鏄潤鎬佹垚鍛樺嚱鏁幫紝瀹冭瀹炰緥鍖栧悗鐩稿綋浜庯細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>static int invoke(any_pointer function_ptr,int a0)<br>{<br>銆//鍏堣漿鍨嬶紝鍐嶈皟鐢紝娉ㄦ剰錛岃繖涓琛岃鍙ヨ繕鏈変竴涓澶栫殑浣滅敤錛屽湪鍚庨潰瑙i噴<br>銆int (*f)(int) = reinterpret_cast錛渋nt(*)(int)錛?function_ptr.func_ptr);<br><br>銆//鍥犱負f鎸囧悜鐨勬槸鐢ㄦ埛淇濆瓨鍦ㄨfunction涓殑鍑芥暟鎴栦豢鍑芥暟錛屾墍浠ヨ繖涓琛岃鍙ヨ繘琛屼簡鐪熷疄鐨勮皟鐢紒<br>銆return f(a0);<br>}</td> </tr> </tbody> </table> <br>銆銆鎴戜滑鍙互鐪嬪嚭錛屽湪invoke鍑芥暟涓紝鐪熸鐨勮皟鐢ㄧ幇韜簡銆?br><br>銆銆濡傛灉鎺ュ彈鐨勬槸浠垮嚱鏁幫紝鍒欐湁function_obj_invoker1涓庡畠瀵瑰簲錛屽悗鑰呬篃鏄竴涓被浼肩殑妯℃澘錛屽畠鐨刬nvoke闈欐佹垚鍛樺嚱鏁扮殑褰㈠紡涔熸槸錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>static R invoke(any_pointer function_obj_ptr,T0 a0);</td> </tr> </tbody> </table> <br>銆銆鍏朵腑function_obj_ptr鏄寚鍚戜豢鍑芥暟鐨勬寚閽堬紝鎵浠ュ叾invoke闈欐佹垚鍛樺嚱鏁頒腑瀵瑰畠鐨勮皟鐢ㄨ鍙ユ槸榪欐牱鐨勶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>FunctionObj* f = (FunctionObj*)(function_obj_ptr.obj_ptr);<br><br>return (*f)(a0); //璋冪敤鐢ㄦ埛鐨勪豢鍑芥暟</td> </tr> </tbody> </table> <br> 鏈鍚庝竴縐嶅彲鑳斤細濡傛灉鎺ュ彈鐨勬槸鎴愬憳鍑芥暟鎬庝箞鍔炲憿錛熺畝鍗曠殑絳旀鏄細boost::function騫舵病鏈変負鎴愬憳鍑芥暟浣滀換浣曠壒孌婂噯澶囷紒鐞嗙敱涔熷緢綆鍗曪紝 boost::function鍙鍏堝皢鎴愬憳鍑芥暟灝佽涓轟豢鍑芥暟錛岀劧鍚庡皢鍏朵綔涓轟竴鑸殑浠垮嚱鏁板寰呭氨琛屼簡錛屽叿浣撲唬鐮佸氨涓嶅垪浜嗭紝STL涓湁涓涓嚱鏁版ā鏉? std::mem_fun灝辨槸鐢ㄤ簬灝佽鎴愬憳鍑芥暟鎸囬拡鐨勶紝瀹冭繑鍥炵殑鏄竴涓豢鍑芥暟銆俠oost涓篃瀵硅鍑芥暟妯℃澘鍋氫簡鎵╁厖錛屼嬌瀹冨彲浠ユ帴鍙椾換鎰忓涓弬鏁扮殑鎴愬憳鍑? 鏁般?br><strong>鍋氫竴涓紝閫佷竴涓斺攊nvoker鐨勯澶栧ソ澶?/strong><br><br>銆銆鎴戜滑娉ㄦ剰鍒癴unction鐨勬瀯閫犲拰璧嬪煎嚱鏁板強鍏跺熀綾葷殑鏋勯犲拰璧嬪煎嚱鏁伴兘 鏄ā鏉垮嚱鏁幫紝榪欐槸鍥犱負鐢ㄦ埛鍙兘鎻愪緵鍑芥暟涔熷彲鑳芥彁渚涘嚱鏁版ā鏉匡紝浣嗘渶鍏抽敭鐨勮繕鏄紝functiont鎻愪緵涓縐嶈兘鍔涳細瀵逛簬function錛渄ouble (int)錛炵被鍨嬬殑娉涘瀷鍑芥暟鎸囬拡錛岀敤鎴峰彲浠ョ粰瀹冧竴涓猧nt(int)綾誨瀷鐨勫嚱鏁扳斺旀槸鐨勶紝榪欐槸鍙涓斿畨鍏ㄧ殑錛屽洜涓哄叾榪斿洖鍊肩被鍨媔nt鍙互瀹夊叏鐨勮漿鍨嬩負 double錛岃屽浜庤繖縐嶇被鍨嬪吋瀹規х殑媯鏌ュ氨鍦ㄤ笂闈㈠垎鏋愮殑invoke闈欐佹垚鍛樺嚱鏁頒腑錛岃繖灝辨槸鎴戜滑瑕佽鐨勯澶栧ソ澶勨斺斿鏋滅被鍨嬪吋瀹癸紝閭d箞invoke鍑芥暟 灝辮兘姝e父緙栬瘧閫氳繃錛屼絾濡傛灉鐢ㄦ埛緇欏嚭綾誨瀷涓嶅吋瀹圭殑鍑芥暟錛屽氨浼氬緱鍒頒竴涓敊璇紝榪欎釜閿欒鏄湪緙栬瘧鍣ㄥ疄渚嬪寲invoke鍑芥暟浠g爜鐨勬椂鍊欑粰鍑虹殑錛屼緥濡傦紝鐢ㄦ埛濡傛灉榪欐牱 鍐欙細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>RT1 f(P1,P2); // RT1(P1,P2)鍑芥暟綾誨瀷錛岃繖閲岀殑RT1,P1,P2鍋囧畾宸茬粡瀹氫箟錛岃繖鏄竴鑸寲鐨勭鍙?br><br>function錛淩T(P)錛?f_ptr; //RT(P)鍑芥暟綾誨瀷錛屽悓鏍峰亣瀹歊T,P宸插畾涔?br><br>f_ptr = &f; //綾誨瀷涓嶅吋瀹癸紝閿欒錛?/td> </tr> </tbody> </table> <br>銆銆榪欏氨浼氬鑷寸紪璇戦敊璇紝閿欒鍙戠敓鍦╥nvoke闈欐佹垚鍛樺嚱鏁頒腑銆備笅闈㈡垜灝變負浣犺В閲婁負浠涔堛?br><br>銆銆鎴戞兂浣犲function_invoker1鑰冪殑涓変釜妯℃澘鍙傛暟浠嶇劧蹇冨瓨鐤戞儜錛屾垜浠啀涓嬈℃潵鍥為【涓涓嬪叾澹版槑錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename FunctionPtr,typename R錛宼ypename T0錛?<br><br>struct function_invoker1</td> </tr> </tbody> </table> <br>銆銆鎴戜滑榪樺緱鎶婄洰鍏夋姇鍚慳ssign_to妯℃澘鍑芥暟錛屽叾涓嬌鐢╢unction_invoker1鐨勬椂鍊欐槸榪欐牱鐨勶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>typedef typename detail::function::get_function_invoker1錛?br><br>FunctionPtr,R,T0錛?:type invoker_type;</td> </tr> </tbody> </table> <br>銆銆榪欓噷錛岀粰鍑虹殑FunctionPtr,R,T0涓変釜妯℃澘鍙傛暟灝嗕細鍘熷皝涓嶅姩鐨勪紶緇檉unction_invoker1錛岄偅涔堝浜庢垜浠笂闈㈢殑閿欒紺轟緥錛岃繖涓変釜妯℃澘鍙傛暟鍚勬槸浠涔堝憿錛?br><br>銆銆棣栧厛錛屾垜浠緢瀹規槗鐪嬪嚭錛孎unctionPtr灝辨槸assign_to妯℃澘鍑芥暟鐨勬ā鏉垮弬鏁幫紝涔熷氨鏄敤鎴蜂紶閫掔殑鍑芥暟鎴栦豢鍑芥暟鐨勭被鍨嬶紝鍦ㄦ垜浠殑閿欒紺轟緥涓紝鍑芥暟f鐨勭被鍨嬩負RT1(P1,P2)錛屾墍浠?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>FunctionPtr = RT1(*)(P1,P2)</td> </tr> </tbody> </table> <br>銆銆鑰孯,T0鍒欐槸鐢ㄦ埛鍦ㄥ疄渚嬪寲function妯℃澘鏃剁粰鍑虹殑妯℃澘鍙傛暟錛屾垜浠啓鐨勬槸function錛淩T(P)錛烇紝浜庢槸:<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>R = RT<br><br>T0 = P</td> </tr> </tbody> </table> <br>銆銆鎵浠ワ紝瀵逛簬鎴戜滑鐨勯敊璇ず渚嬶紝invoker_type鐨勭被鍨嬩負錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>function_invoker1錛?RT1(*)(P1,P2),RT,P錛?/td> </tr> </tbody> </table> <br>銆銆瀵逛簬榪欐牱涓涓猣unction_invoker1錛屽叾鍐呴儴鐨刬nvoke闈欐佹垚鍛樺嚱鏁拌瀹炰緥鍖栦負錛?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>static RT invoke(any_pointer function_ptr,P a0)<br>{<br>銆RT1 (*f)(P1,P2)= //FunctorPtr f =reinterpret_cast錛淩T1(*)(P1,P2)錛?function_ptr.func_ptr);<br>銆return f(a0); //閿欏暒錛佺灖鐬鐨勫瀷鍒紝f鎺ュ彈涓涓狿綾誨瀷鐨勫弬鏁板悧錛熺紪璇戝櫒鍦ㄦ鎵撲綇銆?br>銆//榪欒璇彞鐨勫彟涓涓殣鍚殑媯鏌ユ槸榪斿洖鍊肩被鍨嬪尮閰嶏紝f(...)榪斿洖RT1錛岃宨nvoke欏誨緱榪斿洖RT<br>}</td> </tr> </tbody> </table> <br>銆銆鐪嬬湅鏈鍚庝竴琛岃鍙ワ紝鎵鏈夌殑媯鏌ラ兘鍦ㄩ偅閲屼簡鈥斺旀垜浠渶緇堟妸媯鏌?#8220;濮旀墭”緇欎簡C++搴曞眰鐨勭被鍨嬬郴緇熴?br><br>銆銆寰堢簿濡欎笉鏄悧錛熻櫧鐒跺湪妯℃澘褰㈠紡鐨刟ssign_to鍑芥暟涓紝鐪嬭搗鏉ユ垜浠茍涓嶅叧蹇冨埌搴曠敤鎴風粰鐨勫弬鏁版槸浣曠被鍨嬶紝鐪嬭搗鏉ョ敤鎴峰彲浠ユ妸浠諱綍鍑芥暟鎴栦豢鍑芥暟濉炶繃鏉ワ紝浣嗘槸涓鏃︿笅闈㈣Е鍙奿nvoker鐨勮祴鍊鹼紝灝卞緱瀹炰緥鍖杋nvoke闈欐佹垚鍛樺嚱鏁幫紝鍏朵腑鐨勶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>return f(a0);</td> </tr> </tbody> </table> <br>銆銆涓涓嬪氨鎶婇棶棰樻毚闇插嚭鏉ヤ簡錛佽繖縐嶆妸綾誨瀷媯鏌ュ歡榪熷埌鏈 鍚庯紝涓嶅緱涓嶈繘琛岀殑鏃跺欙紝鐢盋++搴曞眰鐨勭被鍨嬬郴緇熸潵璐熻矗媯鏌ョ殑鎵嬫硶鐨勭‘寰堝濡欌斺旂湅璧鋒潵鎴戜滑娌℃湁鍦╝ssign_to鍑芥暟涓強鏃跺埄鐢ㄧ被鍨嬩俊鎭繘琛岀被鍨嬫鏌ワ紝 浣嗘槸鎴戜滑鍗村茍娌℃湁涓уけ浠諱綍綾誨瀷瀹夊叏鎬э紝涓鍒囨渶緇堥兘閫冧笉榪嘋++搴曞眰鐨勭被鍨嬬郴緇熺殑鑰冮獙錛?br><br>銆<strong>銆function濡備綍瀵瑰緟鎴愬憳鍑芥暟</strong><br><br>銆銆瀵逛簬鎴愬憳鍑芥暟錛宎ssign_to鐨勯噸杞界増鏈彧鏈変竴琛岋細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>this-錛瀉ssign_to(mem_fn(f));</td> </tr> </tbody> </table> <br>銆銆mem_fun(f)榪斿洖涓涓豢鍑芥暟錛屽畠灝佽浜嗘垚鍛樺嚱鏁癴錛屼箣鍚庝竴鍒囩殕涓庝豢鍑芥暟鏃犲紓銆?br><br>銆銆鍏充簬mem_fun鐨勭粏鑺傦紝榪欓噷灝變笉澶氳浜嗭紝澶у鍙互鍙傝僑TL涓殑瀹炵幇錛岀浉淇″緢瀹規槗鐪嬫噦錛岃繖閲屽彧綆鍗曠殑鎻愰啋涓涓嬶紝鎴愬憳鍑芥暟灝佽鐨勬晥鏋滄槸榪欐牱鐨勶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>R (C::*)(T0,T1,...) --錛?R (*)(C*,T0,T1,...) 鎴?R (*)(C&,T0,T1,...)</td> </tr> </tbody> </table> <br>銆銆<strong>safe_bool鎯敤鎵嬫硶</strong><br><br>銆銆濡備綘鎵鐭ワ紝瀵逛簬鍑芥暟鎸囬拡fptr錛屾垜浠彲浠ヨ繖鏍鋒祴璇曞畠錛歩f(fptr) ...錛屾墍浠unction涔熷簲璇ユ彁渚涜繖涓鐗規э紝鐒惰屽鏋滅洿鎺ラ噸杞給perator 銆bool()鍒欎細瀵艱嚧涓嬮潰鐨勪唬鐮佹垚涓哄悎娉曠殑:<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>function錛渋nt(int)錛?f;<br><br>bool b=f;</td> </tr> </tbody> </table> <br>銆銆榪欐樉鐒朵笉濡ワ紝鎵浠unction鐢ㄥ彟涓涓閥濡欑殑鎵嬫硶鏇夸唬瀹冿紝鏃㈡墍璋撶殑safe_bool鎯敤鎵嬫硶錛岃繖鍦╢unction瀹氫箟鍐呴儴鐨勬簮鐮佸涓嬶細<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>struct dummy { void nonnull(){};};<br><br>typedef void (dummy::*safe_bool)(); //紜繚safebool涓嶈兘杞瀷涓轟換浣曞叾瀹冪被鍨嬶紒<br><br>operator safe_bool () const <br><br>{ return (this-錛瀍mpty())? 0 : &dummy::nonnull; }</td> </tr> </tbody> </table> <br> 榪欐牱錛屽綋浣犲啓if(f)鐨勬椂鍊欙紝緙栬瘧鍣ㄤ細鎵懼埌operator safe_bool()錛屼粠鑰屽皢f杞瀷涓簊afe_bool錛岃繖鏄釜鎸囬拡綾誨瀷錛宨f璇彞浼氭紜垽瀹氬畠鏄惁涓虹┖銆傝屽綋浣犺瘯鍥炬妸f璧嬬粰鍏跺畠綾誨瀷鐨勫彉閲忕殑鏃跺欏垯 浼氶伃鍒扮紪璇戞湡鐨勬嫆緇濃斺斿洜涓簊afe_bool鏃犳硶鍚戝叾瀹冪被鍨嬭漿鎹€?br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>get_function_tag錛滐紴</td> </tr> </tbody> </table> <br>銆銆get_function_tag錛滐紴鐢ㄤ簬钀冨彇鍑哄嚱鏁版墍灞炵被鍒?category)錛屽悇涓被鍒湪婧愪唬鐮佷腑宸茬粡鍒楀嚭錛岃嚦浜庡畠鍒板簳鏄浣曡悆鍙栫殑錛岃繖涓庢湰鏂囧叧緋諱笉鏄緢銆澶э紝鏈変竴鐐歸渶瑕佹彁閱掍竴涓嬶細鍑芥暟鎸囬拡綾誨瀷涔熸槸鎸囬拡綾誨瀷錛岃繖鍚搗鏉ュ畬鍏ㄦ槸鍙ュ簾璇濓紝浣嗘槸鑰冭檻榪欐牱鐨勪唬鐮侊細 <br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename T錛?struct is_pointer{enum{value=0};};<br><br>template錛渢ypename T錛?struct is_pointer錛淭*錛瀧enum{value=1};};<br><br>std::cout錛滐紲is_pointer錛渋nt(*)(int)錛?:value; //榪欏皢杈撳嚭 1</td> </tr> </tbody> </table> <br>銆銆涔熷氨鏄int(*)(int)鍙互涓嶵*褰㈠紡鍖歸厤錛屽尮閰嶆椂T涓篿nt(int)銆?br><br>銆銆<strong>鏈鍚庝竴浜涚粏鑺?/strong><br><br>銆銆1. 鎴戞病鏈夌粰鍑篺unction_base鐨勬簮浠g爜錛屽疄闄呬笂閭e緢綆鍗曪紝瀹冩渶涓昏鐨勬垚鍛樺氨鏄痷nion any_pointer鍨嬬殑鏁版嵁鎴愬憳<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>detail::function::any_pointer functor; //鐢ㄤ簬緇熶竴淇濆瓨鍑芥暟鎸囬拡鍙婁豢鍑芥暟瀵硅薄鎸囬拡</td> </tr> </tbody> </table> <br>銆銆2. 鎴戞病鏈夌粰鍑篺unctor_manager鐨勪俊鎭紝瀹為檯涓婂畠涓巉unction鐨勫疄鐜版病鏈夊お澶у叧緋伙紝瀹冭礋璐opy鍜宒elete鍑芥暟瀵硅薄錛屽鏋滃繀瑕佺殑璇濄傛墍浠ユ垜灝嗗畠鐣ュ幓錛屽畠鐨勬簮鐮佸湪錛?#8221;boost/function/function_base.hpp”閲屻?br><br>銆銆3. 鎴戠粰鍑虹殑婧愪唬鐮佹槸灝嗗畯灞曞紑鍚庣殑鐗堟湰錛屽疄闄呯殑浠g爜涓厖鏂ョ潃璁╀漢鐪艱姳緙貢鐨勫畯錛屽叧浜庨偅浜涘畯鍒欏張鏄竴涓濡欑殑涓栫晫銆侭oost搴撻氳繃閭d簺瀹忕渷鍘諱簡璁稿鍙浠g爜閲忋傞殢鐫鍑芥暟鍙傛暟鐨勪笉鍚岋紝閭d簺瀹忎細鎵╁睍鍑篺unction2,function3...鍚勪釜鐗堟湰銆?br><br>銆銆鏈枃鍙爺絀朵簡int(int)鍨嬬殑鎯呭喌錛屽叾瀹冨彧鏄弬鏁版暟鐩殑鏀瑰彉鑰屽凡銆傜粡榪囧畯鐨勬墿灞曪紝function鐨勫亸鐗瑰寲鐗堟湰灝嗘湁:<br><br> <table align="center" bgcolor="#dadacf" border="1" bordercolor="#ffcc66" width="90%"> <tbody> <tr> <td>template錛渢ypename R,typename Allocator錛?br><br>class function錛淩(),Allocator錛?public function0錛淩,Allocator錛?br><br>{...};<br><br>template錛渢ypename R,typename T0,typename Allocator錛?br><br>class function錛淩(T0),Allocator錛?public function1錛淩,T0,Allocator錛?br><br>{...};<br><br>template錛渢ypename R,typename T0,typename T1,typename Allocator錛?br><br>class function錛淩(T0,T1),Allocator錛?public function2錛淩,T0,T1,Allocator錛?br><br>{...};</td> </tr> </tbody> </table> <br><br> 絳夋洿澶氱増鏈紝涓鍏辨湁BOOST_FUNCTION_MAX_ARGS+1涓増鏈紝BOOST_FUNCTION_MAX_ARGS涓轟竴涓畯錛岃〃紺烘渶澶氳兘 澶熸帴鍙楁湁澶氬皯涓弬鏁扮殑鍑芥暟鍙婁豢鍑芥暟瀵硅薄錛屼綘鍙互閲嶆柊瀹氫箟榪欎釜瀹忎負涓涓柊鍊鹼紝浠ユ帶鍒秄unction鎵鑳芥敮鎸佺殑鍑芥暟鍙傛暟涓暟鐨勬渶澶у箋傚叾涓殑 function0,function1,function2絳夊悕瀛椾篃鐢卞畯鎵╁睍鍑恒?br>  闃呰鍏充簬 <a target="_blank"><font color="red">C++</font></a> 鐨勫叏閮ㄦ枃绔?br><img src ="http://m.shnenglu.com/richardhe/aggbug/52148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-04 14:50 <a href="http://m.shnenglu.com/richardhe/articles/52148.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Boost.Function鐨勫熀鏈嬌鐢?/title><link>http://m.shnenglu.com/richardhe/articles/52147.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 04 Jun 2008 06:45:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/52147.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/52147.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/52147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/52147.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/52147.html</trackback:ping><description><![CDATA[<div id="hvzpftn" class="postTitle"> <a href="http://m.shnenglu.com/walkspeed/archive/2007/07/18/28272.html" id="viewpost1_TitleUrl" class="postTitle2">Boost.Function鐨勫熀鏈嬌鐢?/a> </div> Boost.Function搴撶敤鏉ユ彁渚涗竴涓璞″寲鐨勫嚱鏁版寚閽堛?br><br>鍑芥暟鎸囬拡瀵硅璁″緢鏈夌敤銆傚畠浣胯皟鐢ㄨ呭彲浠ュ歡鏈熻皟鐢紝璋冪敤鏃舵満鐢辮皟鐢ㄨ呯‘瀹氥傝屼笖鍙互鏀瑰彉<br>鍝嶅簲鑰咃紝浠ュ簲瀵逛笉鍚岀殑瑕佹眰銆?br><br>C涓殑鍑芥暟鎸囬拡鍙兘鐢ㄤ簬鑷敱鍑芥暟銆傚湪C++涓櫎浜嗚嚜鐢卞嚱鏁拌繕鏈夊嚱鏁板璞″拰綾繪垚鍛樺嚱鏁幫紝榪欎簺<br>C鐨勫嚱鏁版寚閽堟槸鏃犳硶鐢ㄧ殑銆傝繖瑕佹眰鑳介傚簲C++璇█鐨勫嚱鏁版寚閽堛傛棦鐒禖++璇█鏈韓娌℃湁鎻愪緵錛?br>閭e氨鎻愪緵涓涓簱銆俿tl鎻愪緵浜嗭紝浣嗘槸瀹氫箟浜嗗緢澶氱被鍨嬶紝浣跨敤璧鋒潵騫朵笉鏄緢鏂逛究錛岃屼笖鍑芥暟鍙傛暟<br>鐨勪釜鏁拌闄愬畾鍦ㄤ袱涓互涓嬶紝鏇磋兘鏄鍙楅檺鍒躲侭oost.Function搴撴彁渚涗簡涓涓ソ鐨勮В鍐蟲柟妗堛?br><br>Boost.Function搴撳彲浠ユ敮鎸佽嚜鐢卞嚱鏁幫紝鍑芥暟瀵硅薄錛岀被鎴愬憳鍑芥暟銆傝屼笖鍙傛暟涓暟澶氳揪10涓?br>Boost.Function搴撳埄鐢ㄦā鏉挎妧鏈潵瀹炵幇銆傜敓鎴愮殑浠g爜鏈夊緢楂樼殑榪愯鏁堢巼銆傛湰搴撳彲浠ヤ笉鐢ㄧ紪璇?br>鐩存帴浣跨敤銆?br><br>Boost.Function鐨勫ご鏂囦歡銆?br>function.hpp<br><br>瀹氫箟涓涓狟oost.Function鐨勫璞★紙鏄竴涓繑鍥炲肩被鍨嬩負int錛岀涓涓弬鏁版槸std::string綾誨瀷<br>絎簩涓弬鏁版槸float綾繪柊錛?br><br>boost::function< int ( std::string, float ) > funptr;<br><br>涓婇潰榪欎釜瀹氫箟鏂瑰紡鏄竴縐嶅鏄撶悊瑙g殑瀹氫箟鏂瑰紡銆備絾鏈変簺緙栬瘧鍣ㄤ笉鏀寔錛屽鏋滄兂鏇村鐨勭紪璇戝櫒<br>鏀寔錛屽垯鐢ㄤ笅闈㈣繖縐嶅畾涔夋柟寮?br><br>boost::function2< int, std::string, float > funptr;<br><br>娉ㄦ剰妯℃澘涓湁3涓被鍨嬶紝鑰宖unction綾誨嵈鏄痓oost::function2銆傚簲涓鴻繑鍥炲肩被鍨嬩笉璁$畻鍦ㄥ弬鏁?br>綾誨瀷涓紙鍘熷洜寰堢畝鍗曪紝C++鐨勭紪璇戝櫒涓嶄細鏍規嵁榪斿洖綾誨瀷涓嶅悓鏉ュ尯鍒嗗嚱鏁板畾涔夌殑涓嶅悓錛夈?br><br>int freefun( std::string str, float f )<br>{<br>    std::cout << str << " : " << f << std::endl;<br>    return 0;<br>}<br><br>class CFun<br>{<br>public:<br>    int operator() ( std::string str, float f )<br>    {<br>        std::cout << str << " : " << f << std::endl;<br>        return 0;  <br>    }<br>}<br><br>涓婇潰瀹氫箟浜嗕竴涓嚜鐢卞嚱鏁板拰涓涓嚱鏁板璞°備笅闈㈠皢鎶婁粬浠粯緇檉unction瀵硅薄銆?br><br>璧嬪間負鑷敱鍑芥暟<br>funptr = &freefun;<br><br>璧嬪間負鍑芥暟瀵硅薄<br>CFun fun;<br>funptr = fun;<br><br>浠ヤ笂涓ょ鎯呭喌鐨勮皟鐢ㄦ柟娉曚竴鑷達紝濡備笅<br>funptr( "float =", 10.0 );<br><br>Boost.Function瀵硅薄瑕佽兘鎸囧悜綾誨瀷鍘熷嚱鏁幫紝鍏跺畾涔夎濡備笅<br><br>class FreeClass<br>{<br>public:<br>    int out( std::string str, float f )<br>    {<br>        std::cout << str << " : " << f << std::endl;<br>        return 0;  <br>    }<br>};<br><br>boost::function< int ( FreeClass*, std::string, float ) > funptr;<br><br>璺ㄥ鉤鍙扮殑瀹氫箟鏂規硶<br>boost::function3< int, FreeClass*, std::string, float > funptr;<br><br>璧嬪兼柟娉?br>funptr = &FreeClass::out;<br><br>璋冪敤鏂規硶<br>FreeClass fc;<br><br>funptr( &fc, "float =", 10.0 );<img src ="http://m.shnenglu.com/richardhe/aggbug/52147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-04 14:45 <a href="http://m.shnenglu.com/richardhe/articles/52147.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浠垮嚱鏁般佺粦瀹氥佹ˉ鎺ャ佸鎵樼浉鍏寵璁?/title><link>http://m.shnenglu.com/richardhe/articles/52015.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Tue, 03 Jun 2008 03:39:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/52015.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/52015.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/52015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/52015.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/52015.html</trackback:ping><description><![CDATA[flipcode<br>浠垮嚱鏁般佺粦瀹氥佹ˉ鎺ャ佸鎵樼浉鍏寵璁?<br>浠ヤ笅闅忎究璁ㄨ涓嬶紝娌$獊鍑虹殑涓績璁虹偣錛屼釜涓悊璁哄彧浠h〃鎴戜釜浜鴻鐐癸紝闅懼厤鏈夐敊:)錛屾榪庢寚姝c?br>涓銆傞渶姹?<br>鍦ㄤ簨浠跺鐞嗗父甯鎬細紕板埌榪欐牱鐨勬儏鍐碉細<br>1銆傛帴鍙e垎紱匯傚嵆invokers(璋冪敤鑰?涓?receivers)鎺ユ敹鑰呭垎紱匯?br>2銆傛椂闂村垎紱匯?br><br>姣斿璇達細UI鐩稿叧鍏冪礌錛堟寜閽佽彍鍗曠瓑錛夊氨鏄竴涓猧nvokers銆?br>receivers鍒欐槸鍝嶅簲鍛戒護鐨勫璞★紙濡傚璇濇鎴栧簲鐢ㄧ▼搴忔湰韜級銆?br>榪欓渶瑕佹垜浠鍏堝皢UI鐩稿叧鍏冪礌鐨勪簨浠跺搷搴旂殑鎺ユ敹鑰呭湪鍒濆鍖栨椂鍏堜繚瀛樿搗鏉ャ?br>寰呭悗鐢ㄦ埛鎸変笅鎸夐挳絳夊啀瑙﹀彂錛堝嵆invokers閫氳繃璋冪敤瀵瑰簲鍏堝墠淇濆瓨鐨剅eceivers鏉ユ墽琛屽懡浠わ級<br>鍡紝鍦╠elphi銆乯ava銆乿cl銆?net涓湁鐩稿叧鐨勫疄鐜般傝寁c鍒欓渶瑕佽嚜宸辨潵寮勩?br><br>浜屻備豢鍑芥暟鐨勫疄鐜?<br>鍦ㄨ浠垮嚱鏁板墠鍏堣璇存垜浠簲璇ユ庝箞淇濆瓨榪欎簺鎿嶄綔鐩稿叧鍑芥暟鐨勫憿錛?br>// 涓鑸殑鍑芥暟鎴戜滑鍙互榪欎箞瀛?<br>void (*fun)() = Test;<br>(*fun)();<br>// 鑰岀被鎴愬憳鍑芥暟鍙互榪欎箞鍋?<br>void (CTest::*mfn)(); // 鎴栫敤 typedef void (CTest::*MFN_TEST)(); MFN_TEST mfn;<br>mfn = CTest::Test;<br>CTest a, *p=new CTest;<br>(a.*mfn)(); // 璋冪敤鏂規硶1<br>(p->*mfn)(); // 璋冪敤鏂規硶2<br>濡備笂鎵榪板彲瑙佷負浜嗗鐞嗗墠闈㈡墍榪扮殑浜嬩歡鍝嶅簲鎯呭喌錛屾垜浠氬父浼氱敤鍥炶皟鍑芥暟錛?br>灝辨槸鎶婄被鎴愬憳鍑芥暟瀹氫箟涓洪潤鎬佸嚱鏁幫紝鍦ㄥ垵濮嬫椂淇濆瓨鍑芥暟鍦板潃錛堜笌涓鑸嚱鏁板鐞嗙被鍚岋級鍙婂搴旂殑瀵硅薄鎸囬拡錛?br>鍦ㄤ簨浠惰Е鍙戞椂璋冪敤瀵瑰簲鐨勯潤鎬佸嚱鏁幫紝鑰岃鍑芥暟涓湪鎶婃寚閽堝己鍒惰漿鍖栦負瀵瑰簲綾誨瀷瀵硅薄鍦板潃錛?br>寰椾互鎿嶇旱璇ュ璞$殑鎴愬憳鍙橀噺(鍡紝鐞嗚涓婅窡鎴愬憳鍑芥暟鐨勫疄鐜板樊涓嶅錛屾垚鍛樺嚱鏁頒細鐢辯紪璇戝櫒瀹夋彃涓涓?br>this鎸囬拡浣滀負絎?涓弬鏁頒紶緇欏嚱鏁幫紝浠ヤ究鍙互鎿嶄綔璇his瀵硅薄鐨勬垚鍛?銆?br><br>鍥炶皟鍑芥暟搴旂敤鐨勫叿浣撲唬鐮佸涓?<br>1). 鍥炶皟鎺ュ彛(闈欐佸嚱鏁版硶):<br>//======================================================<br>#include "stdafx.h"<br>#include <br><br>typedef void(*KEY_RESPOND)(void* /*,param*/);<br>struct CListener<br>{<br>void* pThis;<br>KEY_RESPOND pfn;<br>CListener() : pThis(0), pfn(0){}<br>};<br>class CInput<br>{<br>std::list m_listListener;<br>public:<br>void AddListener( CListener* pListener ){<br>m_listListener.push_back( pListener );<br>}<br>void RemoveListerner( CListener* pListener ){<br>std::list::iterator iter;<br>for( iter = m_listListener.begin(); iter!= m_listListener.end();iter++ ){<br>if( pListener == (*iter) ){<br>m_listListener.erase( iter ); break;<br>}<br>}<br>}<br>void HitOneKey(){<br>std::list::iterator iter;<br>for( iter = m_listListener.begin(); iter!= m_listListener.end();iter++ ){<br>if( (*iter)->pfn && (*iter)->pThis ){<br>(*(*iter)->pfn)( (*iter)->pThis );<br>}<br>}<br>}<br>void clearListener(){<br>m_listListener.clear();<br>}<br>};<br>class CUI<br>{<br>public:<br>static void InputProc(void* pThis/*,param*/){<br>__asm int 3 // 涓嬩釜鏂偣嫻嬭瘯涓嬶紙鏌愪簺緙栬瘧鍣ㄤ笉鑳借繖涔堝啓錛寁c鍙互錛?br>}<br>};<br><br>CUI ui;<br>CInput input;<br>int _tmain(int argc, _TCHAR* argv[])<br>{<br>// 鍒濆:<br>CListener* pListener = new CListener;<br>pListener->pfn = &CUI::InputProc;<br>pListener->pThis = &ui;<br>// 瑙﹀彂:<br>input.AddListener( pListener ); // input鍗充負invokers錛堣皟鐢ㄨ咃紝浣嗗彨瑙﹀彂鑰呭ソ鐐癸級<br>input.HitOneKey(); // 鏌愬浜嬩歡瑙﹀彂,鍐呴儴鍛煎彨receivers(榪欓噷鏄師鍏堜繚瀛樼殑CUI瀵硅薄)鏉ョ湡姝e鐞嗚浜嬩歡(InputProc(...)鏂規硶)銆?br>// 娓呴櫎<br>input.clearListener();<br>if( pListener )<br>{<br>delete pListener;<br>pListener = NULL;<br>}<br>return 0;<br>}<br>//======================================================<br><br>// 絎?縐嶆柟娉? 鍥炶皟綾?铏氬嚱鏁板鎬佹硶):<br>//======================================================<br>class IWillBack<br>{<br>public:<br>virtual void InputProc(/*鍙傛暟鐣?..*/){}<br>};<br>class CInput<br>{<br>public:<br>void RegisterListener(IWillBack* pListener){<br>m_pListener = pListener; // 榪欓噷鐢╨ist瀛樿搗鏉ユ墠濂斤紝榪欓噷鍙綔嫻嬭瘯<br>}<br>void OnInputEvent(){<br>m_pListener->InputProc(/*鍙傛暟鐣?..*/);<br>}<br><br>private:<br>IWillBack* m_pListener;<br>};<br>class CUI : public IWillBack<br>{<br>public:<br>void InputProc(/*鍙傛暟鐣?..*/){ /*..瀹為檯澶勭悊浠g爜..*/}<br>private:<br>};<br><br>int _tmain(int argc, _TCHAR* argv[])<br>{<br>CInput aa;<br>CUI bb;<br>aa.RegisterListener(&bb);<br>aa.OnInputEvent();<br>return 0;<br>}<br>//======================================================<br><br>浣嗘槸絎?縐嶉潤鎬佸嚱鏁扮敤娉曟槸涓嶇洿瑙傜殑錛岀2縐嶉渶瑕佹淳鐢熷鍔犱簡涔嬮棿鐨勮仈緋伙紝鑰屼負浜嗘柟渚挎垜浠氬父浼氬皢鎴愬憳鍑芥暟鎸囬拡杞寲涓哄嚱鏁板璞℃潵澶勭悊,鍗充豢鍑芥暟(涓鑸槸鎸囬噸杞戒簡()鎿嶄綔絎︾殑綾?鏉ュ疄鐜般?br><br>綾諱技浜庤繖鏍風殑鎿嶄綔錛宻tl鎻愪緵浜唌em_fun銆乵em_fun_ref銆乥inder1st銆乥inder2nd綆鍗曟搷浣溿?br>浣唖tl鐨勬柟娉曠浉瀵規瘮杈冨師濮嬭屽彈闄愬埗錛屾瘮濡傝std::mem_fun闇瑕佹垚鍛樺嚱鏁版湁榪斿洖鍊?<br>std::mem_fun鏈澶氬彧鑳芥敮鎸佹垚鍛樺嚱鏁版湁涓涓弬鏁扮瓑錛?br>涓嬮潰鏉ョ湅std:mem_fun_ref涓嶆敮鎸佹垚鍛樺嚱鏁拌繑鍥炲間負void鐨勪竴涓緥瀛?<br>//======================================================<br>#include <br>class CFoo<br>{<br>public:<br>void test() // 鍙湁灝唙oid鏀規垚鍒殑綾誨瀷鎵嶅彲浠ワ紝濡?int<br>{<br>return 0;<br>}<br>};<br>void main()<br>{<br>CFoo t;<br>std::mem_fun_ref(&CFoo::test)(t);<br>}<br>//======================================================<br>涓婅堪浠g爜鍙湁灝唙oid鏀規垚鍒殑綾誨瀷錛堝int錛夋墠鍙互錛?br>閭d箞涓轟粈涔堜笉鍙互澶勭悊榪斿洖void鐨勫嚱鏁板憿? stl鐨勫疄鐜扮┒绔熸槸鎬庝箞鏍風殑鍛?<br>鍡紝stl綆鍗曞疄鐜頒簡mem_fun_ref鍙妋em_fun,鍏朵腑mem_fun_ref浠ュ紩鐢ㄦ柟寮忓鐞嗗嚱鏁版墍灞炲璞★紝<br>鑰宮em_fun浠ユ寚閽堟柟寮忓鐞嗗嚱鏁版墍灞炲璞°?br>鐜板湪璁╂垜浠粠vc鐨剆tl鎸栧嚭閮ㄤ喚浠g爜鏉ョ湅鐪嬶紝<br><br>1.stl鐨勫疄鐜?<br>浠em_fun_ref涓轟緥(鐪佺暐鏌愪簺瀵硅鏄庝笉閲嶈鐨勭粏鑺傦紝涓ゆ潯铏氱嚎鍖呮嫭鐨勪唬鐮佷負stl綾諱技婧愮爜):<br>//======================================================<br>//----------------------------------------------------------<br>namespace stl_test<br>{<br>// 涓昏瀹炵幇:<br>template<br>class mem_fun_ref_t<br>{<br>public:<br>mem_fun_ref_t( R (T::*_Pm)() ) : _Ptr(_Pm) {} // 鏋勯? 淇濆瓨鎴愬憳鍑芥暟鍦板潃<br>R operator()(T& _X) const // 璋冪敤: 榪欓噷鍙湅鍑簃em_fun_ref浠ュ紩鐢ㄦ柟寮忓鐞?br>{<br>return ((_X.*_Ptr)()); // 榪欓噷鎵ц璋冪敤鍑芥暟錛屽茍榪斿洖璇ュ嚱鏁版墍榪斿洖鍊?br>}<br>private:<br>R (T::*_Ptr)(); // 鎸囧悜鎴愬憳鍑芥暟鍦板潃鐨勬寚閽?br>};<br>// 榪欓噷鍙槸鍒╃敤鍑芥暟鐨勫弬鏁版帹瀵兼潵鑷姩鑾峰彇鍨嬪埆(鏂逛究璋冪敤)<br>template inline<br>mem_fun_ref_t mem_fun_ref(R (T::*_Pm)())<br>{<br>return (mem_fun_ref_t(_Pm));<br>}<br><br>} // end of namespace test_stl<br>//----------------------------------------------------------<br>class CFoo<br>{<br>public:<br>int test1(){<br>__asm int 3<br>return 0;<br>}<br>void test2(){<br>__asm int 3<br>}<br>};<br>int APIENTRY WinMain(HINSTANCE hInstance,<br>HINSTANCE hPrevInstance,<br>LPSTR lpCmdLine,<br>int nCmdShow)<br>{<br>CFoo t;<br>stl_test::mem_fun_ref( &CFoo::test1 ) (t);<br>return 0;<br>}<br>//======================================================<br>/////////////////////////////////////////////////////////////////<br>浠庢簮鐮?return ((_X.*_Ptr)()); " 鍙互鐪嬪埌stl鐩存帴榪斿洖璇ュ嚱鏁版墍榪斿洖鍊箋?br>鎵浠ュ嚱鏁版病鏈夎繑鍥炲鹼紙鍗充負void鏃訛級鐨勮瘽緙栬瘧鍣ㄥ氨浼氭姤閿欍傚ソ錛岄偅涔堝鏋滄垜浠湪<br>榪欓噷鍙槸鐩存帴鎵ц鍑芥暟鑰屼笉鐢╮eturn榪斿洖鐨勮瘽緙栬瘧鍣ㄥ簲璇ュ彲浠ラ氳繃浜嗐?br><br>鍡紝boost涓鏄繖涔堝鐞嗙殑銆傦紙btw.涓轟簡鏇翠負閫氱敤錛宐oost瀵箂tl鍘熸湁浠垮嚱鏁板強緇戝畾浣滀簡澶ч噺鐨勬敼榪涘伐浣滐級銆?br>浣嗘槸鍏蜂綋搴旇鎬庝箞鍖哄垎鏈夋病鏈夎繑鍥炲煎憿錛熻繖涓篃瀹規槗錛屾垜浠彧闇鐢ㄥ埌妯℃澘鐨勫亸鐗規у氨鍙?br>浠ュ仛鍒般備笅闈㈠氨鐪嬬湅boost鐨勫疄鐜?btw.boost鏈変袱縐嶇増鏈紝鎴戠敤鐨勬槸鍏煎鐗堟湰錛屼唬鐮侀毦鐪?<br><br>2. boost鐨勫疄鐜?榪欓噷鎴戞妸boost鐨勪竴澶у爢瀹忥紙鐪烜$@#@#闅劇湅錛宭oki鍦ㄨ繖鏂歸潰鏉ュ緱姣旇緝娓呯埥錛夊幓鎺変簡):<br>/////////////////////////////////////////////////////////////////<br>// notreturn.cpp : Defines the entry point for the application.<br>//<br><br>#include "stdafx.h"<br>//------------------------------------<br>namespace boost_test<br>{<br>template // 鏈夎繑鍥炲兼椂浼氳皟鐢ㄨ繖涓?br>struct mf<br>{<br>template<br>class inner_mf0<br>{<br>R (T::*_Ptr)();<br>public:<br>inner_mf0(R (T::*f)()) : _Ptr(f) {}<br>R operator()(T& X) const<br>{<br>return ((X.*_Ptr)());<br>}<br>};<br>};<br>template<> // 娌℃湁鍙嶅洖鍊兼椂浼氳皟鐢ㄨ繖涓?br>struct mf // 鍋忕壒鍖?br>{<br>template<br>class inner_mf0<br>{<br>R (T::*_Ptr)();<br>public:<br>inner_mf0(R (T::*f)()) : _Ptr(f) {}<br>R operator()(T& X) const<br>{<br>((X.*_Ptr)());<br>}<br>};<br>};<br>// 鍒涘緩涓媧劇敓綾?媧劇敓浜庝笂榪板熀綾?br>template<br>struct mf0 : public mf::inner_mf0<br>{<br>typedef R(T::*F)();<br>explicit mf0(F f) : mf::inner_mf0(f) {}<br>};<br>// 閫氳繃鍑芥暟鐨勫弬鏁版帹瀵艱嚜鍔ㄨ幏鍙栫被鍨?br>template<br>mf0 mem_fn( R(T::*f)() )<br>{<br>return mf0(f);<br>}<br>} // namespace boost_test<br>//------------------------------------<br><br>class CFoo<br>{<br>public:<br>int test1(){ return 0; }<br>void test2(){}<br>};<br>int APIENTRY WinMain(HINSTANCE hInstance,<br>HINSTANCE hPrevInstance,<br>LPSTR lpCmdLine,<br>int nCmdShow)<br>{<br>CFoo t;<br>boost_test::mem_fn( &CFoo::test1 ) (t);<br>return 0;<br>}<br>/////////////////////////////////////////////////////////////////<br><br>浠庝笂榪頒唬鐮佸彲浠ョ湅鍒板亸鐗規у府鍔╂垜浠В鍐充簡榪斿洖鍊間負void鐨勬儏鍐點備絾鏄墜鍐欎簡涓や喚<br>鍩烘湰鐩稿悓鐨勪唬鐮併傘傘?br>鍙﹀澶勭悊鍙傛暟涓暟鐨勬儏鍐典篃寰堝鏄擄紝鍙鍒嗗埆瀹炵幇涓嶅悓鍙傛暟鐨勫悇涓ā鏉跨被灝卞彲浠ヤ簡錛?br>boost鏈澶氬彧鑳芥敮鎸佹垚鍛樺嚱鏁版湁8涓弬鏁幫紝鍥犱負瀹冨唴閮ㄥ疄鐜頒簡8浠借繖鏍蜂笉鍚屽弬鏁版ā鏉跨被銆?br>鍏跺疄鐨勫鐞嗘柟娉曢兘鏄竴妯′竴鏍風殑錛屽彲鏄敱浜庤璦鐨勯檺鍒舵垜浠繕鏄病鏈夊姙娉曚笉涓涓瀹炵幇<br>涓嶅悓鍙傛暟鐨勭被:銆傚湪loki涓弬鏁板彲浠ョ敤TList瀹炵幇浠繪剰鐨勫弬鏁幫紝浣嗘槸鍦ㄥ疄鐜拌繕鏄緱鑰?br>鑰佸疄瀹炵殑姣忎喚鎵嬪啓涓浠斤紙loki瀹炵幇浜?5浠藉彲浠ユ敮鎸?5涓弬鏁幫級銆?br>榪欑湡璁╀漢閮侀椃銆傘傘備笉榪囨病鍔炴硶銆?br><br>璇村畬鏉ヤ豢鍑芥暟錛屼笅闈㈠紑濮嬭璇存湁鍏崇粦瀹氾紝stl銆乥oost銆乴oki鐨勭粦瀹氱殑鎰忔濇槸<br>瀵規煇鐗╁疄浣撶殑“緇戝畾”錛岄氫織鏉ヨ鏄寚瀵瑰嚱鏁般佹瀯閫犲嚱鏁般佷豢鍑芥暟絳変笌鍏跺搴旂殑鏌愪釜鍙傛暟鐨勭粦瀹氾紝<br>浠ヤ究鍦ㄨ皟鐢ㄦ椂涓嶇敤鍐嶆杈撳叆姝ゅ弬鏁幫紙鍥犱負鏌愪簺鏃跺欏弬鏁版槸鍥哄畾鐨勶紝姣斿璇寸粦瀹氫竴涓唴閮ㄥ瓨鏈?br>鎴愬憳鍑芥暟鍦板潃鐨勪豢鍑芥暟鍜屽畠瀵瑰簲鐨勫璞″湴鍧鍦ㄤ竴璧鳳級銆?br>浠ヤ笅鏄痵tl鐨刡ind鐢ㄦ硶:<br>//================================<br>#include "stdafx.h"<br>#include // stl<br>#include // boost<br><br>struct CFoo {<br>int test(int){<br>return 0;<br>}<br>};<br>void main()<br>{<br>boost::function1 f; // 榪欓噷鐢ㄤ簡boost<br>CFoo obj;<br>f = std::bind1st(std::mem_fun(&CFoo::test), &obj);<br>f(5);<br>}<br>//================================<br>loki涓殑BindFirst姣旇緝綾諱技浜巗tl鐨刡inder<br>(binder1st錛宐inder2nd)錛屼絾鏄畠鏄氱敤鐨勶紝鍙互閫氳繃宓屽瀹炵幇浠繪剰澶氫釜鍙傛暟緇戝畾錛?br>//================================<br>void f()<br>{<br>Functor cmd1(something);<br>Functor cmd2(BindFirst(cmd1, 10));<br>cmd2(20);<br>Functor cmd3(BindFirst(cmd2, 30));<br>cmd3();<br>}<br><br>鑰宐oost涓殑瀹炵幇鏄互鍗犱綅絎︽潵琛ㄧ幇,鍏蜂綋濡備綍瀹炵幇錛屼笅鍥炵戶緇璁?鍡紝<br>boost浠g爜鐨勫畯澶浜嗭紝榪欓儴浠借繕鏄瓑鏈夌┖鍐嶈ˉ鍏ㄤ簡錛岀幇鍦ㄦ垜浠潵鐪嬬湅濡備綍瀹炵幇涓涓鎵樼被)<br><br>涓夈傚鎵樼被鐨勫疄鐜?<br>1. 妗ユ帴妯″紡:<br>璁捐妯″紡鍛婅瘔鎴戜滑鍙互浣跨敤妗ユ帴妯″紡(Bridge Pattern)鍑忓皯瀵硅薄涔嬮棿鐨?鑰﹀悎搴︼紝妗ユ帴妯″紡濡備笅:<br>Invoker <>------------------->* Interface<br>^<br>|<br>Receiver<br>涓婂浘鐨処nvoker琛ㄧず浜嬩歡瑙﹀彂鑰咃紝Receiver琛ㄧず浜嬩歡澶勭悊鑰咃紝絎﹀彿綾諱技浜庯紲c++澶ц妯$紪紼嬨傘傦紴涓涔︽墍鎻忚堪錛堟敞錛氳繖閲岀鍙峰浣嶅彲鑳藉嚭閿欙細鍙樻垚宸﹀榻愪簡錛夛紝<br>鍏朵腑<>------------------->琛ㄧずInvoker 鍐呭惈(鎷ョ敤)Interface(鍗矷nvoker 鏈塈nterface鐨勫彉閲忔垨鎸囬拡騫惰礋璐nterface鐨勯噴鏀?錛?br>鑰?鍙瘋〃紺哄彲鏈夊涓?br>^<br>| 銆鍙峰垯琛ㄧず緇ф壙浜庯紙Receiver緇ф壙浜嶪nterface錛夈?br><br>濂斤紝鎴戜滑鍏堟潵鍒嗘瀽鍓嶉潰鍦? 絎?縐嶆柟娉? 鍥炶皟綾?铏氬嚱鏁板鎬佹硶):"鐨勫疄鐜版濇兂(璇峰洖鍒板墠闈㈢湅鐪嬩唬鐮?錛?br>瀹冨叾瀹炲氨鏄竴涓ˉ鎺ユā寮忥紝濡備笅(鎷彿鍐呭搴斿墠闈㈡墍瀹炵幇鐨勭被)錛?br>Invoker(CInput) <>--------------->* Interface錛圛WillBack錛?br>^<br>|<br>Receiver錛圕UI錛?br>瀵圭収鎴戜滑鍓嶉潰瀹炵幇鐨勪唬鐮佸彲浠ュ彂鐜版縐嶅疄鐜扮殑妗ユ帴鐨勭己鐐規槸錛氭瘡涓涓兂瑕?br>娉ㄥ唽涓鏂規硶鍒癐nvoker涓互渚縄nvoker鍦ㄤ簨浠惰Е鍙戞椂璋冪敤鐨勭被(濡俁eceiver)閮借媧劇敓鑷狪nterface銆?br>鏈夋病鏈夋洿濂界殑鍔炴硶鍐嶆鍑忓皯榪欑鑰﹀悎搴﹀憿錛熻繖姝f槸涓嬮潰鎴戜滑瑕佽<br>璁虹殑涓嬩竴縐嶈璁℃ā寮忥細<br>2. 濮旀墭涓庝簨浠?<br>濮旀墭鐨勫鐞嗚璁″涓?<br>Invoker <>--------------------->* Interface<br>^<br>|<br>Implementation -----------------> Receiver<br>鍗沖湪鍘熸ˉ鎺ユā寮忎笅鍐嶅姞涓灞傞棿鎺ユ?Implementation 銆傚叾涓?br>Implementation涓嶳eceiver涔嬮棿鐨?---------------->琛ㄧずImplementation寮曠敤浜哛eceiver涓浜涙湇鍔★紝<br>鍗矷mplementation鐢ㄥ埌浜哛eceiver鏌愪簺涓滆タ錛堝鍑芥暟鎴栨暟鎹級銆傚棷錛岃繖浜涜В閲婁笉鐭ユ槸鍚﹂傚綋錛屽笇鏈涗笉浼氳瀵箋傘傘?br>濂斤紝涓寮濮嬪彲鑳芥垜浠細榪欎箞璁捐:<br>//======================================================================================<br>class handle {};<br>template <br>class Implementation : public handle<br>{<br>T* m_pThis;<br>public:<br>Implementation ( T* pThis ) : m_pThis(pThis) {}<br>template<br>void execute( void (T::*mfn)(T1), T1 arg ) { (m_pThis->*mfn)( arg ); }<br><br>};<br>struct Receive {<br>void Proc(int) {<br>__asm int 3<br>}<br>};<br>Receive a;<br>void Invoker(){<br>Implementation test = Implementation (&a);<br>test.execute( Receive::Proc, 10 ); // 褰撲簨浠跺彂鐢熸椂璋冪敤<br>};<br>int _tmain(int argc, _TCHAR* argv[])<br>{<br>Invoker();<br>}<br>//======================================================================================<br>浣嗘槸Invoker鐭ラ亾浜嗗お澶歊eceive鐨勪俊鎭紝鍐典笖鎴戜滑鎯寵瑙﹀彂鑰匢nvoker浣滄垚涓涓被銆?br>涓涓敼榪涚殑鐗堟湰濡備笅:<br>//-------------------------------------------------------------<br>// signal slot system<br>// 娉? 璇ユ硶鎴戞槸鐪嬩簡"钀芥湪闅忛"鐨?濮旀墭銆佷俊鍙峰拰娑堟伅鍙嶉鐨勬ā鏉垮疄鐜版妧鏈?錛?br>// 浠g爜浣滀簡閮ㄤ喚娣誨姞銆傚湪榪欓噷闈炲父鐨勬劅璋粬!<br>// 浠栫殑鍗氬錛歨ttp://blogs.gcomputing.com/rocwood/archives/000154.html<br>//-------------------------------------------------------------<br>// Delegation.cpp : Defines the entry point for the console application.<br>//<br>#include <br><br>#ifndef K_DELEGATE_H<br>#define K_DELEGATE_H<br><br>namespace kUTIL<br>{<br>// 1. 妗ユ帴綾?綰櫄綾?:<br>// 涓轟粈涔堝彨浣滄ˉ鎺?<br>// 鍥犱負閫氳繃瀹冪殑铏氬嚱鏁版柟娉曞彲浠ヨ皟鐢ㄥ埌瀵瑰簲鐨勬紜殑涓嶅悓媧劇敓瀹炰緥(鎸囧悗闈?br>// 鎻愬埌鐨勫鎵樹漢)鎵鏀瑰啓鐨勮櫄鍑芥暟鏂規硶(榪欐槸濮旀墭浜虹敤鏉ュ畬鎴愬鎵樹換鍔$殑鏂規硶)<br>struct kDelegationInterface<br>{<br>virtual ~kDelegationInterface() {};<br>virtual void Execute() = 0;<br>};<br>// 2. 濮旀墭綾?媧劇敓浜庢ˉ鎺ョ被錛岃繖閲屾垜鍙負”濮旀墭浜?#8220;)<br>// 涓轟粈涔堝彨濮旀墭錛?br>// 鍥犱負璋冪敤鑰呮妸“閫氱煡”鐨勫伐浣滃鎵樼粰瀹冩潵璐熻矗澶勭悊銆?br>// 涓涓?#8220;濮旀墭浜?#8221;淇濆瓨浜? a.”鎺ユ敹鑰?#8220;(瀵硅薄鎸囬拡m_pThis) 鍙?b.“瑕佷綔鐨勪簨”(鏂規硶鎸囬拡m_mfn)錛?br>// 浠ヤ究璋冪敤鑰呭彂鍑轟俊鍙峰脊(鍚庨潰鎻愬埌,淇″彿寮規湁涓涓綔妗ユ帴鐢ㄧ殑綰櫄綾葷殑鎸囬拡鎸囧悜鐩稿簲鐨勫鎵樹漢)<br>// 鍛婄煡姝や俊鍙峰搴旂殑濮旀墭浜烘潵瀹屾垚瀹冭濮旀墭鐨勫伐浣滐細鍗寵“鎺ユ敹鑰?#8221;(m_pThis)浣?#8221;瑕佷綔鐨勪簨“(m_mfn)銆?br>template<br>struct kDelegationImpl : public kDelegationInterface<br>{<br>typedef void ( T::* MFN )();<br>kDelegationImpl( T* pthis, MFN mfn ) : m_pThis( pthis ), m_mfn( mfn ) {<br>}<br>virtual void Execute() {<br>if( m_pThis ) { <br>( m_pThis->*m_mfn )(); <br>}<br>}<br>T* m_pThis;<br>MFN m_mfn;<br>};<br><br>// 3. 淇″彿寮?瀹炵幇涓轟豢鍑芥暟鏉ヨ皟鐢ㄧ粺涓鐨勮櫄鍑芥暟鎺ュ彛):<br>// 涓轟粈涔堝彨淇″彿錛?br>// 鍥犱負褰?淇″彿寮?鍙戝皠鏃?璋冪敤淇″彿鐨勬搷浣滅"()")<br>// 瀹冧細閫氱煡鎵鎸囧悜鐨?濮旀墭浜?浜嬩歡鍙戠敓浜?璋冪敤綰櫄綾繪寚閽堢殑m_DI->Execute()鏂規硶)銆?br>// 涓涓俊鍙蜂繚瀛樹簡涓涓寚鍚戝搴?#8221;濮旀墭浜?#8220;鐨勬ˉ鎺ョ被(綰櫄綾?鎸囬拡銆?br>struct kSignal0<br>{<br>kDelegationInterface* m_DI; // 綰櫄綾葷殑鎸囬拡<br>kSignal0() : m_DI(0) {}<br>// 1. 綰櫄綾葷殑m_DI鎸囬拡鍙互鎸囧悜涓嶅悓鐨勬淳鐢熷疄渚?<br>template<br>void ConnectSlot(T* recv, void (T::* mfn)()) {<br>DisConnect();<br>m_DI = new kDelegationImpl( recv, mfn );<br>int test = 0;<br>}<br>void DisConnect() {<br>if( m_DI ) { delete m_DI; m_DI = NULL; }<br>}<br>// 2. 鐢ㄧ粺涓鐨勭函铏氱被鎸囬拡璋冪敤涓嶅悓媧劇敓綾繪敼鍐欑殑铏氬嚱鏁?br>void operator() () { <br>if( m_DI ) {<br>m_DI->Execute(); <br>}<br>}<br>};<br><br>// 涓嬮潰鏄袱涓負鏂逛究浣跨敤鐨勫嚱鏁?<br>template<br>void kConnect( kSignal0& sgn, T* pObj, void(T::*fn)())<br>{<br>sgn.ConnectSlot( pObj, fn );<br>int i = 0;<br>}<br>inline void kDisConnect( kSignal0& sgn )<br>{<br>sgn.DisConnect();<br>}<br>} // end of namespace kUTIL<br>#endif //#ifndef K_DELEGATE_H<br><br>//----------------------------------------------------------------------------<br>// 涓涓嬌鐢ㄥ疄渚?<br>class kButton {<br>public:<br>kUTIL::kSignal0 sgnMouseBtnUp;<br>void OnMouseButtonUp() { sgnMouseBtnUp(); }<br>};<br><br>class kDialog {<br>kButton btn;<br>public:<br>kDialog() {<br>kUTIL::kConnect( btn.sgnMouseBtnUp, this, &kDialog::DoWork ); // vc6涓嬭繖閲宬Dialog::DoWork鐨勫墠闈竴瀹氳鍙姞"&"鍙?br>}<br>void DoWork() { <br>__asm int 3<br>}<br>void TestMouseHit() { btn.OnMouseButtonUp(); }<br>};<br><br>int main(int argc, char* argv[])<br>{<br>kDialog dlg;<br>kButton btn;<br>kUTIL::kConnect( btn.sgnMouseBtnUp, &dlg, kDialog::DoWork ); // vc6涓嬭繖閲宬Dialog::DoWork鐨勫墠闈㈠彲鍔?涓嶅姞"&"鍙?br><br>// 嫻嬭瘯涓:<br>btn.OnMouseButtonUp();<br><br>// 嫻嬭瘯浜?<br>dlg.TestMouseHit();<br>return 0;<br>}<br><br>// 濮旀墭瀹炰緥鎬葷粨錛?br>// 涓嬮潰鎴戜滑鏉ュ叿浣撹鏄?#8221;褰撴煇浜嬪彂鐢熸椂錛岃皟鐢ㄨ呭彂灝勪俊鍙峰脊閫氱煡瀵瑰簲鐨勬帴鏀惰呬綔鐩稿簲澶勭悊“<br>// 1. "璋冪敤鑰? 鎷ユ湁鍚勭淇″彿寮廣?br>// 2. 鍒濆鏃訛紝鎴戜滑鎶婁俊鍙峰脊涓庡搴旂殑濮旀墭浜鴻仈緋昏搗鏉ワ紝騫惰濮旀墭浜鴻褰曞湪淇″彿瑙﹀彂鏃跺簲璇ラ氱煡鐨?鎺ユ敹浜?鍜?鎺ユ敹浜鴻浣滅殑浜?銆?br>// a. 淇″彿寮逛繚瀛樹簡妗?綰櫄綾?鎸囬拡錛屾寚閽堟寚鍚戦氳繃鍏舵ā鏉垮嚱鏁癈onnectSlot鏂規硶鏉ユ壘鍑?浜х敓鐨?濮旀墭浜?濮旀墭瀹炰緥)銆?br>// b. 濮旀墭浜?濮旀墭瀹炰緥)鍦ㄤ俊鍙峰脊鐢–onnectSlot鏂規硶浜х敓瀹冪殑鏃跺欎繚瀛樹簡鍑芥暟ConnectSlot鎵浼犲叆鐨勪袱涓弬鏁幫細<br>// 鍗?鎺ユ敹鑰呮寚閽?鍙?鍏舵柟娉曟寚閽?銆?br>// 3. 褰撲簨浠跺彂鐢熸椂"璋冪敤鑰?鍙戝皠瀵瑰簲淇″彿寮瑰悗錛屼俊鍙峰脊浼氳皟鐢ㄥ叾鎵淇濆瓨鐨勭函铏氱被鎸囬拡鐨勮櫄鍑芥暟鏂規硶錛?br>// 浜庢槸鐢變簬铏氬嚱鏁扮壒鎬у氨浼氳皟鐢ㄥ埌鍏舵墍鎸囧悜鐨勫鎵樺疄渚?濮旀墭浜?鎵鏀瑰啓鐨勬柟娉曘?br>// 5. 濮旀墭浜烘敼鍐欑殑鏂規硶涓氳繃鍏舵墍淇濆瓨鐨?#8221;鎺ユ敹鑰呮寚閽?#8220;鍙婂叾"鏂規硶鎸囬拡"鏉ュ懠鍙?鎺ユ敹鑰?鐢ㄥ搴旂殑”鏂規硶鎸囬拡“<br>// 鏉ュ鐞嗕簨鎯呫?br>// 鍗沖涓嬫祦紼?<br>// "璋冪敤鑰?鍙戝皠"淇″彿寮? ---> "淇″彿寮?閫氳繃"妗?鎵懼埌瀵瑰簲"濮旀墭浜? ---> "濮旀墭浜?鍛煎彨"鎺ユ敹鑰?浣?璇ヤ綔鐨勪簨"<br><br>//=============================================================================<br>鍡紝榪欐牱鍒版錛屼竴涓潪甯告柟渚跨殑濮旀墭綾誨氨寰椾互瀹炵幇浜嗭紒濡傛灉浣犺繕涓嶆噦鐨勮瘽璇蜂粩緇嗙殑鐞㈢(錛屽姝ょ簿鍗?鍥犱負綆鍗曡屽己澶?<br>涓嶈閿欒繃銆備笉榪囦笂榪板彧鏄儴浠藉疄鐜幫紝褰撲綘瑕佹敮鎸佸甫鍙傛暟鍙婅繑鍥炲肩殑鍚勭鎯呭喌鐨勮瘽錛岃繕寰楄嚜宸變綔鎵╁厖銆?br>榪斿洖鍊肩殑澶勭悊鏂規硶鍙弬瑙佸墠闈㈠墫榪癰oost鐨刴em_fn鐨勫鐞嗘柟娉曪紝鑰屽甫涓嶅悓鍙傛暟鐨勫鐞嗗垯鍙兘涓涓鎵嬪姩<br>瀹炵幇錛屽氨璞″墠闈㈡墍璇寸殑閭f牱錛岃繖鏄緢鏃犲鐨勪簨鎯咃紝浣嗘槸鐩墠鏉ヨ娌℃湁鍔炴硶銆傘傘?br><br>(寰呯畫銆傘傘傘傘傘?濡傛灉鏈夋椂闂存湁蹇呰鐨勮瘽銆傘傘?<br><br>闄?<br>loki涓嬭澆:<br>http://sourceforge.net/projects/loki-lib/<br><br>boost涓嬭澆:<br>http://sourceforge.net/projects/boost/<br><br>2004.10.26鏇存柊錛?br>淇:<br>鍘焩oid connect( Signal0& sgn,T1 obj, void(T2::*fn)())鏀規垚<br>void connect( Signal0& sgn,T1& obj, void(T2::*fn)())<br>鍙﹀鍔犱簡kDisConnect閲婃斁鍐呭瓨錛屽師鏉ュ彧浣滄祴璇曟病鍐欏畠錛岀幇鍦ㄨ繕鏄姞涓婁簡銆?br><br>--------------------------------------------------------------------------------<br><br>鍗冮噷椹倽<br>瀹炲湪鏄お濂戒簡<br><br>PS錛岄槼鏄ョ殑涓滆タ錛屽氨浼氭洸楂樺悎瀵°?:D<br><br>--------------------------------------------------------------------------------<br><br>flipcode<br>濂戒箙娌′笂緗戜簡錛?br>浠婂ぉ涓婃潵鐪嬪埌鐗堜富鐨勫じ濂栵紝<br>铏界劧鏄繃濂栦簡錛屼笉榪囪繕鏄劅瑙夎交椋橀鐨勩傘傘傚樋鍢縹~~錛?:D<br><br>--------------------------------------------------------------------------------<br><br>kane<br>鍡紝榪欑鎶宸ф槸姣旇緝瀹炵敤鐨勩?img src ="http://m.shnenglu.com/richardhe/aggbug/52015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-06-03 11:39 <a href="http://m.shnenglu.com/richardhe/articles/52015.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>濡備綍灝?6榪涘埗瀛楃涓茶漿鎹㈡垚鏁村瀷錛?/title><link>http://m.shnenglu.com/richardhe/articles/50068.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Fri, 16 May 2008 09:44:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/50068.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/50068.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/50068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/50068.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/50068.html</trackback:ping><description><![CDATA[<span style="color: #000000;">杞嚜http://m.shnenglu.com/alantop/archive/2008/05/15/49989.html<br> </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> test[] </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">0xf</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> lResult </span><span style="color: #000000;">=</span><span style="color: #000000;"> strtol(test, </span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">, </span><span style="color: #000000;">16</span><span style="color: #000000;">);</span><img src ="http://m.shnenglu.com/richardhe/aggbug/50068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-05-16 17:44 <a href="http://m.shnenglu.com/richardhe/articles/50068.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>callback functionhttp://m.shnenglu.com/richardhe/articles/49933.htmlRichardHeRichardHeThu, 15 May 2008 06:54:00 GMThttp://m.shnenglu.com/richardhe/articles/49933.htmlhttp://m.shnenglu.com/richardhe/comments/49933.htmlhttp://m.shnenglu.com/richardhe/articles/49933.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/49933.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/49933.html澹版槑鍑芥暟鎸囬拡

鍥炶皟鍑芥暟鏄竴涓▼搴忓憳涓嶈兘鏄懼紡璋冪敤鐨勫嚱鏁幫紱閫氳繃灝嗗洖璋冨嚱鏁扮殑鍦板潃浼犵粰璋冪敤鑰呬粠鑰屽疄鐜拌皟鐢ㄣ傝瀹炵幇鍥炶皟錛屽繀欏婚鍏堝畾涔夊嚱鏁版寚閽堛傚敖綆″畾涔夌殑璇硶鏈夌偣涓嶅彲鎬濊錛屼絾濡傛灉浣犵啛鎮夊嚱鏁板0鏄庣殑涓鑸柟娉曪紝渚夸細鍙戠幇鍑芥暟鎸囬拡鐨勫0鏄庝笌鍑芥暟澹版槑闈炲父綾諱技銆傝鐪嬩笅闈㈢殑渚嬪瓙錛?br>
void f()錛?/ 鍑芥暟鍘熷瀷

涓婇潰鐨勮鍙ュ0鏄庝簡涓涓嚱鏁幫紝娌℃湁杈撳叆鍙傛暟騫惰繑鍥瀡oid銆傞偅涔堝嚱鏁版寚閽堢殑澹版槑鏂規硶濡備笅錛?br>
void (*) ();

璁╂垜浠潵鍒嗘瀽涓涓嬶紝宸﹁竟鍦嗘嫭寮т腑鐨勬槦鍙鋒槸鍑芥暟鎸囬拡澹版槑鐨勫叧閿傚彟澶栦袱涓厓绱犳槸鍑芥暟鐨勮繑鍥炵被鍨嬶紙void錛夊拰鐢辮竟鍦嗘嫭寮т腑鐨勫叆鍙e弬鏁幫紙鏈緥涓弬鏁版槸絀猴級銆傛敞鎰忔湰渚嬩腑榪樻病鏈夊垱寤烘寚閽堝彉閲?鍙槸澹版槑浜嗗彉閲忕被鍨嬨傜洰鍓嶅彲浠ョ敤榪欎釜鍙橀噺綾誨瀷鏉ュ垱寤虹被鍨嬪畾涔夊悕鍙婄敤sizeof琛ㄨ揪寮忚幏寰楀嚱鏁版寚閽堢殑澶у皬錛?br>
// 鑾峰緱鍑芥暟鎸囬拡鐨勫ぇ灝?br>unsigned psize = sizeof (void (*) ());

// 涓哄嚱鏁版寚閽堝0鏄庣被鍨嬪畾涔?br>typedef void (*pfv) ();

pfv鏄竴涓嚱鏁版寚閽堬紝瀹冩寚鍚戠殑鍑芥暟娌℃湁杈撳叆鍙傛暟錛岃繑鍥炵被琛屼負void銆備嬌鐢ㄨ繖涓被鍨嬪畾涔夊悕鍙互闅愯棌澶嶆潅鐨勫嚱鏁版寚閽堣娉曘?br>
鎸囬拡鍙橀噺搴旇鏈変竴涓彉閲忓悕錛?br>
void (*p) (); //p鏄寚鍚戞煇鍑芥暟鐨勬寚閽?br>
p鏄寚鍚戞煇鍑芥暟鐨勬寚閽堬紝璇ュ嚱鏁版棤杈撳叆鍙傛暟錛岃繑鍥炲肩殑綾誨瀷涓簐oid銆傚乏杈瑰渾鎷姬閲屾槦鍙峰悗鐨勫氨鏄寚閽堝彉閲忓悕銆傛湁浜嗘寚閽堝彉閲忎究鍙互璧嬪鹼紝鍊肩殑鍐呭鏄講鍚嶅尮閰嶇殑鍑芥暟鍚嶅拰榪斿洖綾誨瀷銆備緥濡傦細

void func()
{
/* do something */
}
p = func;

p鐨勮祴鍊煎彲浠ヤ笉鍚岋紝浣嗕竴瀹氳鏄嚱鏁扮殑鍦板潃錛屽茍涓旂講鍚嶅拰榪斿洖綾誨瀷鐩稿悓銆?br>
浼犻掑洖璋冨嚱鏁扮殑鍦板潃緇欒皟鐢ㄨ?br>
鐜板湪鍙互灝唒浼犻掔粰鍙︿竴涓嚱鏁幫紙璋冪敤鑰咃級- caller()錛屽畠灝嗚皟鐢╬鎸囧悜鐨勫嚱鏁幫紝鑰屾鍑芥暟鍚嶆槸鏈煡鐨勶細

void caller(void(*ptr)())
{
ptr(); /* 璋冪敤ptr鎸囧悜鐨勫嚱鏁?*/
}
void func();
int main()
{
p = func;
caller(p); /* 浼犻掑嚱鏁板湴鍧鍒拌皟鐢ㄨ?*/
}

濡傛灉璧嬩簡涓嶅悓鐨勫肩粰p錛堜笉鍚屽嚱鏁板湴鍧錛夛紝閭d箞璋冪敤鑰呭皢璋冪敤涓嶅悓鍦板潃鐨勫嚱鏁般傝祴鍊煎彲浠ュ彂鐢熷湪榪愯鏃訛紝榪欐牱浣夸綘鑳藉疄鐜板姩鎬佺粦瀹氥?br>
璋冪敤瑙勮寖

鍒扮洰鍓嶄負姝紝鎴戜滑鍙璁轟簡鍑芥暟鎸囬拡鍙婂洖璋冭屾病鏈夊幓娉ㄦ剰ANSI C/C++鐨勭紪璇戝櫒瑙勮寖銆傝澶氱紪璇戝櫒鏈夊嚑縐嶈皟鐢ㄨ鑼冦傚鍦╒isual C++涓紝鍙互鍦ㄥ嚱鏁扮被鍨嬪墠鍔燺cdecl錛宊stdcall鎴栬卂pascal鏉ヨ〃紺哄叾璋冪敤瑙勮寖錛堥粯璁や負_cdecl錛夈侰++ Builder涔熸敮鎸乢fastcall璋冪敤瑙勮寖銆傝皟鐢ㄨ鑼冨獎鍝嶇紪璇戝櫒浜х敓鐨勭粰瀹氬嚱鏁板悕錛屽弬鏁頒紶閫掔殑欏哄簭錛堜粠鍙沖埌宸︽垨浠庡乏鍒板彸錛夛紝鍫嗘爤娓呯悊璐d換錛堣皟鐢ㄨ呮垨鑰呰璋冪敤鑰咃級浠ュ強鍙傛暟浼犻掓満鍒訛紙鍫嗘爤錛孋PU瀵勫瓨鍣ㄧ瓑錛夈?br>
灝嗚皟鐢ㄨ鑼冪湅鎴愭槸鍑芥暟綾誨瀷鐨勪竴閮ㄥ垎鏄緢閲嶈鐨勶紱涓嶈兘鐢ㄤ笉鍏煎鐨勮皟鐢ㄨ鑼冨皢鍦板潃璧嬪肩粰鍑芥暟鎸囬拡銆備緥濡傦細

// 琚皟鐢ㄥ嚱鏁版槸浠nt涓哄弬鏁幫紝浠nt涓鴻繑鍥炲?br>__stdcall int callee(int);

// 璋冪敤鍑芥暟浠ュ嚱鏁版寚閽堜負鍙傛暟
void caller( __cdecl int(*ptr)(int));

// 鍦╬涓紒鍥懼瓨鍌ㄨ璋冪敤鍑芥暟鍦板潃鐨勯潪娉曟搷浣?br>__cdecl int(*p)(int) = callee; // 鍑洪敊


鎸囬拡p鍜宑allee()鐨勭被鍨嬩笉鍏煎錛屽洜涓哄畠浠湁涓嶅悓鐨勮皟鐢ㄨ鑼冦傚洜姝や笉鑳藉皢琚皟鐢ㄨ呯殑鍦板潃璧嬪肩粰鎸囬拡p錛屽敖綆′袱鑰呮湁鐩稿悓鐨勮繑鍥炲煎拰鍙傛暟鍒椼?br>

RichardHe 2008-05-15 14:54 鍙戣〃璇勮
]]>
銆婅璁℃ā寮忕簿瑙c嬭涔︾瑪璁?/title><link>http://m.shnenglu.com/richardhe/articles/49843.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 14 May 2008 09:53:00 GMT</pubDate><guid>http://m.shnenglu.com/richardhe/articles/49843.html</guid><wfw:comment>http://m.shnenglu.com/richardhe/comments/49843.html</wfw:comment><comments>http://m.shnenglu.com/richardhe/articles/49843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/richardhe/comments/commentRss/49843.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/richardhe/services/trackbacks/49843.html</trackback:ping><description><![CDATA[<div id="hvzpftn" class="postTitle"> <a id="AjaxHolder_ctl01_TitleUrl" class="postTitle2">銆婅璁℃ā寮忕簿瑙c嬭涔︾瑪璁?<杞?gt;http://www.cnblogs.com/lzcarl/archive/2005/09/01/228281.html</a> </div> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">1</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佹ā寮忔槸搴旇緇撳悎鍦ㄤ竴璧峰叡鍚岃В鍐抽棶棰樼殑銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氫互鍓嶇湅銆?/span><span lang="EN-US">GOF</span><span style="font-family: 瀹嬩綋;">璁捐妯″紡銆嬬殑鏃跺欎富瑕佸氨鏄湅鐩殑錛岀劧鍚庡氨鏄唬鐮侊紝瀵瑰崗浣滃晩錛屼紭緙虹偣鍟婏紝鏁堟灉鍟婇兘涓嶆庝箞娉ㄦ剰錛屼笉榪囧氨綆楃湅浜嗕篃涓嶇煡鎵浜戙傚涓嬫潵灝卞儚鑳屾暟瀛﹀叕寮忎竴鏍鳳紝鍗曚釜鏄浣忎簡錛屾嬁鍒板叿浣撶幆澧冮噷鍙堟嚨浜嗐傜湅鏉ヨ繕鏄緱澶氳姳鐐規椂闂寸湅鐪嬫ā寮忕殑鍏寵仈鍟娿?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">2</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佹垜鐨勯敊璇槸錛氭垜灝濊瘯鍏堝垱寤洪棶棰橀鍩熶腑鐨勭瘡錛岀劧鍚庡皢榪欎簺綾葷紳鍚堣搗鏉ュ艦鎴愭渶緇堢殑緋葷粺銆傗斺?/span><span lang="EN-US">Alexander</span></strong><strong><span style="font-family: 瀹嬩綋;">鎶婅繖鏍風殑榪囩▼縐頒負涓涓?#8220;鍧忎富鎰?#8221;銆傛垜浠庢潵娌℃湁闂繃鎴戣嚜宸憋細鎴戞槸鍚︽嫢鏈夋紜殑綾伙紵浠呬粎鍥犱負榪欎簺綾葷湅璧鋒潵濡傛姝g‘銆佸姝ゆ槑鏄俱傛垜鎷ユ湁鐨勬槸鍦ㄥ紑濮嬪垎鏋愭椂绔嬪埢榪涘叆鑴戞搗涓殑綾伙紝鏄垜浠殑鑰佸笀鍛婅瘔鎴戜滑搴旇鍦ㄧ郴緇熶腑瀵繪壘鐨?#8220;鍚嶈瘝”銆備絾鏄垜鐨勯敊璇氨鏄粎浠呭皾璇曟妸瀹冧滑綆鍗曞湴鏀懼湪涓璧楓?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氳繛澶х墰閮戒細鐘繖鏍風殑閿欒錛屾垜榪欐牱鐨勮彍楦熻繖鏍峰垎鏋愮郴緇熷簲璇ヤ篃姣旇緝姝e父鍚с傚湪鐪嬮棶棰樼殑灞傛涓婏紝鎴戜滑澶繃浜庨噸瑙嗙粏鑺傦紝灝卞儚鎴戝啓</span><span lang="EN-US">WinForm</span><span style="font-family: 瀹嬩綋;">紼嬪簭鏃跺厛鑰冭檻鏈夊摢浜涚粍浠跺彲浠ヤ嬌鐢ㄤ竴鏍鳳紝鎶婃濊礬緇欓檺鍒朵綇浜嗭紝蹇借浜嗙被鎵澶勭殑鐜銆佷笂涓嬫枃銆?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">3</span></strong><strong><span style="font-family: 瀹嬩綋;">銆侀潰鍚戝璞$殑鑼冨紡錛氫嬌鐢ㄥ璞″皢璐d換杞箟鍒版洿灞閮ㄧ殑鑼冨洿銆傚璞″簲璇ュ鑷繁璐熻矗錛屽茍涓旇繖縐嶈矗浠誨簲璇ヨ娓呮鐨勫畾涔夊嚭鏉ャ?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氳繖涓綾葷殑瀹氫箟灝辮鍚堢悊鐨勫銆備綔鑰呰涓鴻蔣浠跺紑鍙戜腑鏈変笁涓瑙掞細姒傚康錛堢敤渚嬶級錛?/span><span lang="EN-US">></span><span style="font-family: 瀹嬩綋;">瑙勬牸錛堟帴鍙o級錛?/span><span lang="EN-US">></span><span style="font-family: 瀹嬩綋;">瀹炵幇錛堜唬鐮侊級銆備粠鏈浣庡眰嬈$湅錛岀被灝辨槸鍙橀噺</span><span lang="EN-US">+</span><span style="font-family: 瀹嬩綋;">鍑芥暟錛屼絾榪欐牱灝卞お鐙殬浜嗐傜湡姝g殑瀵硅薄搴旇涓庣幇瀹炵敓媧諱腑鐨勫璞$浉浼鹼紝鏈夎嚜宸辯殑琛屼負銆佺姸鎬侊紝<strong>鑷繁瀵硅嚜宸辮礋璐?/strong>錛堝涔堢簿紜殑姒傝堪鍟婏級銆?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">4</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佹娊璞$被灝辨槸鍏朵粬綾葷殑鍗犱綅絎︺?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氭瘮杈冨艦璞$殑鎻忚堪銆傛垜鍏堟弿榪扮被鐨勫ぇ鑷磋涓轟緵璋冪敤鑰呬簡瑙o紝鍏蜂綋鐨勮涓虹暀鍒板瓙綾誨疄鐜幫紝鎶借薄綾諱笌瀛愮被杈炬垚涓涓綰︺?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">5</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佽繃鏃╃殑瀵圭粏鑺傛姇鍏ヨ繃澶氱殑鍏沖績鏄竴涓垎鏋愮己闄楓?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氬悓</span><span lang="EN-US">2</span><span style="font-family: 瀹嬩綋;">銆?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">6</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佺暀鎰忎綘鐨勭洿瑙傦細褰撲綘鐪嬪埌鏌愪簺涓嶅枩嬈㈢殑涓滆タ鏃訛紝浣犺儍閮ㄧ殑鎰熻銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氱墰浜哄氨鏄菇榛樸傝繖閲屼富瑕佹槸璇存槑濡備綍鎰熻涓涓璁℃槸鍧忕殑璁捐鐨勩傛垜鏄鏈榪戝啓紼嬪簭鑳冭佷笉鑸掓湇錛岄キ涔熷悆涓嶅ソ……</span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">7</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佸叧娉ㄦā寮忕殑鍦烘櫙鑰岄潪瑙e喅鏂規銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氫綔鑰呰嚜濮嬭嚦緇堜竴鐩村己璋冩槸鍦烘櫙鍐沖畾瑙e喅鏂規錛岃屼笉鏄負浜嗗疄鐜版煇涓ā寮忚屽幓榪涜璁捐錛屽惁鍒欏氨鍍忓皬瀛︾敓濂楀叕寮忎竴鏍蜂簡銆傚満鏅垎鏋愬ソ浜嗭紝妯″紡鑷劧涔熷氨鍑烘潵浜嗭紙榪欐槸澧冪晫姣旇緝楂樼殑鏃跺欙級銆?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">8</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佸湪鍒涘緩瀵硅薄鏃剁敤鍏卞悓鐐?/span><span lang="EN-US">/</span></strong><strong><span style="font-family: 瀹嬩綋;">鍙樺寲鐐瑰垎鏋愯岄潪瑙傚療鍚嶈瘝涓庡姩璇嶃傚洜姝わ紝鎴戜滑瑕侊細</span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>a</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佸彂鐜板茍灝佽鍙樺寲鐐廣?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>b</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佷紭鍏堜嬌鐢ㄥ璞$粍鍚堬紝鑰岄潪綾葷戶鎵褲?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氬叧浜庡叡鍚岀偣</span><span lang="EN-US">/</span><span style="font-family: 瀹嬩綋;">鍙樺寲鐐圭殑鍒嗘瀽錛屽湪</span><span lang="EN-US">Bridge</span><span style="font-family: 瀹嬩綋;">妯″紡涓綋鐜扮殑鐘逛負鏄庢樉錛堟垜鍦ㄥ墠闈㈢殑</span><span lang="EN-US">Blog</span><span style="font-family: 瀹嬩綋;">涓粙緇嶈繃錛夛紝鍊熷姪鍒嗘瀽鐭╅樀涔熷彲浠ュ府鍔╃悊娓呮濊礬銆傝?/span><span lang="EN-US">b</span><span style="font-family: 瀹嬩綋;">鐐規槸闈㈠悜瀵硅薄璁捐涓殑鍩烘湰鍘熷垯錛屽氨涓嶇敤澶氳浜嗐?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">9</span></strong><strong><span style="font-family: 瀹嬩綋;">銆?/span><span lang="EN-US">switch</span></strong><strong><span style="font-family: 瀹嬩綋;">璇彞甯稿父鏍囧織鐫錛氾紙</span><span lang="EN-US">1</span></strong><strong><span style="font-family: 瀹嬩綋;">錛夊澶氭佽涓虹殑闇瑕併傦紙</span><span lang="EN-US">2</span></strong><strong><span style="font-family: 瀹嬩綋;">錛夊瓨鍦ㄧ潃鏀鵑敊鍦版柟鐨勮矗浠匯傝鑰冭檻鐢ㄤ竴縐嶆洿鏅傜殑瑙e喅鏂規浠f浛</span><span lang="EN-US">switch</span></strong><strong><span style="font-family: 瀹嬩綋;">璇彞錛屾瘮濡傛娊璞°佸皢璐d換鍒嗛厤緇欏彟澶栫殑瀵硅薄絳夌瓑銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氳佸惉鍒漢璇翠笐闄嬬殑</span><span lang="EN-US">switch</span><span style="font-family: 瀹嬩綋;">璇彞銆?/span><span lang="EN-US">ifelse</span><span style="font-family: 瀹嬩綋;">璇彞錛岄兘涓嶆槸澶噦錛岀幇鍦ㄥソ鍍忔湁鐐規噦浜嗭紝鍥犱負鏉′歡璇彞涓嶇伒媧伙紝寰堥毦緇存姢鍚с傜鍒板畠椹笂灝辮鎯沖埌鐢ㄥ鎬佺殑鏂瑰紡鍘誨鐞嗭紝鍍?/span><span lang="EN-US">State</span><span style="font-family: 瀹嬩綋;">妯″紡銆?/span><span lang="EN-US">Visitor</span><span style="font-family: 瀹嬩綋;">妯″紡灝卞拰榪欐湁鍏熾?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">10</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佺敤妯″紡鐨勬柟娉曞幓鎬濊冿細</span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-family: 瀹嬩綋;">姝ラ錛?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-family: 瀹嬩綋;">錛?/span><span lang="EN-US">1</span></strong><strong><span style="font-family: 瀹嬩綋;">錛夈佸彂鐜版垜鍦ㄩ棶棰橀鍩熶腑鎷ユ湁鐨勬ā寮?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-family: 瀹嬩綋;">錛?/span><span lang="EN-US">2</span></strong><strong><span style="font-family: 瀹嬩綋;">錛夈佸浜庤繖浜涢渶瑕佸垎鏋愮殑妯″紡錛屽仛涓嬪垪宸ヤ綔錛?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>a</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佹寫鍑轟負鍏朵粬妯″紡鎻愪緵鏈澶氬満鏅殑妯″紡銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>b</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佸湪鎴戞蹇墊ф渶楂樼殑璁捐涓嬌鐢ㄨ繖涓ā寮忋?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>c</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佽瘑鍒換浣曞彲鑳藉凡緇忓嚭鐜扮殑闄勫姞妯″紡銆傚皢瀹冧滑娣誨姞鍒?#8220;闇瑕佸垎鏋愮殑妯″紡”涓?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US"><span>   </span>d</span></strong><strong><span style="font-family: 瀹嬩綋;">銆佸闇瑕佸垎鏋愯屾湭鍒嗘瀽鐨勬ā寮忥紝閲嶅涓婅堪宸ヤ綔銆?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-family: 瀹嬩綋;">錛?/span><span lang="EN-US">3</span></strong><strong><span style="font-family: 瀹嬩綋;">錛夈佹寜鐓ч渶瑕佸皢緇嗚妭娣誨姞鐨勮璁′腑銆傛墿灞曟柟娉曞拰綾誨畾涔夈?/span><span lang="EN-US"><o:p></o:p></span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氬叿浣撶殑璇村氨鏄壘鍒板彲浠ョ粺棰嗗叏灞鐨勬ā寮忥紝鍐嶇敤鍏朵粬鐨勬ā寮忛厤鍚堝畠錛?#8220;闈㈠悜妯″紡鐨勮璁?#8221;</span><span lang="EN-US">(POP)<img src="http://www.cnblogs.com/Emoticons/emteeth.gif" align="absmiddle" border="0"></span><span style="font-family: 瀹嬩綋;">銆傜畻浜嗗惂錛屾垜榪?/span><span lang="EN-US">OOP</span><span style="font-family: 瀹嬩綋;">閮芥病瀛﹀ソ錛岃繖涓互鍚庡啀璇村暒銆?/span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">11</span><span style="font-family: 瀹嬩綋;">銆佸湪瀛︿範闈㈠悜瀵硅薄鎶鏈殑鏃╂湡瀛︿範璁捐妯″紡錛屽彲浠ュぇ澶у府鍔╀綘鎻愰珮瀵歸潰鍚戝璞″垎鏋愩佽璁$殑鐞嗚В銆?/span></strong></p> <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 瀹嬩綋;">璇勮錛氳繖涓掓槸絎竴嬈″惉璇達紝涓嶈繃鎬庝箞涔熷緱鍏堟妸緇ф壙銆佸皝瑁呫佸鎬佸紕娓呮鍚с傚啀鍔犱笂涓鏉★紝鍦ㄥ涔犺璁℃ā寮忔椂錛屼竴瀹氳鍏堣榪欐湰銆婅璁℃ā寮忕簿瑙c嬶紝鍐嶇湅銆?/span><span lang="EN-US">GOF</span><span style="font-family: 瀹嬩綋;">璁捐妯″紡銆嬶紝</span><span lang="EN-US"><img src="http://www.cnblogs.com/Emoticons/emwink.gif" align="absmiddle" border="0"></span><span style="font-family: 瀹嬩綋;">銆?/span></p><img src ="http://m.shnenglu.com/richardhe/aggbug/49843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-05-14 17:53 <a href="http://m.shnenglu.com/richardhe/articles/49843.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>OOD鍘熷垯錛歋RP銆丱CP浠ュ強LSPhttp://m.shnenglu.com/richardhe/articles/49813.htmlRichardHeRichardHeWed, 14 May 2008 05:21:00 GMThttp://m.shnenglu.com/richardhe/articles/49813.htmlhttp://m.shnenglu.com/richardhe/comments/49813.htmlhttp://m.shnenglu.com/richardhe/articles/49813.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/49813.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/49813.html
鍗曚竴鑱岃矗鍘熷垯錛圫RP : Single Response Principle)

灝變竴涓被鑰岃█錛屽簲璇ヤ粎鏈変竴涓紩璧峰畠鍙樺寲鐨勫師鍥犮?br>鍦ㄨ繖閲岋紝鑱岃矗鐨勫畾涔夋槸錛? “鍙樺寲鐨勫師鍥?#8221;銆?/font>

瀵逛簬浣曟椂閬靛驚SRP鏈変互涓嬬殑鑰冭檻錛?br>1.濡傛灉搴旂敤紼嬪簭鐨勫彉鍖栦細褰卞搷鍒扮被涓煇涓縐嶈亴璐o紝閭d箞灝卞簲璇ュ皢瀹冧笌鍙︿竴縐嶈亴璐e垎寮錛岃繖鏍峰仛鍙互閬垮厤瀹㈡埛搴旂敤紼嬪簭鍜岀被涓殑榪欎袱鑱岃矗鑰﹀悎鍦ㄤ竴璧楓?br>2.濡傛灉搴旂敤紼嬪簭鐨勫彉鍖栨繪槸浼氬鑷翠袱涓亴璐e悓鏃跺彉鍖栵紝閭d箞灝變笉蹇呰鍒嗙瀹冧滑銆傚疄闄呬笂錛屽垎紱誨畠浠細寮曡搗涓嶅繀瑕佺殑澶嶆潅鎬с?br>
浠庝笂鍙互寰楃煡錛氬彉鍖栫殑杞寸嚎浠呭綋鍙樺寲瀹為檯鍙戠敓鏃舵墠鍏鋒湁鐪熸鐨勬剰涔夈傚鏋滄病鏈夊緛鍏嗭紝閭d箞鍘誨簲鐢⊿RP錛屾垨鑰呬換浣曞叾瀹冨師鍒欓兘鏄笉鏄庢櫤銆?br>
瀹為檯搴旂敤錛氭寔涔呭寲錛圥ersistence錛?/strong>
瀹? 闄呭紑鍙戜腑錛岃冭檻鍒頒笟鍔¤鍒欐槸浼氶綣佹敼鍙樼殑錛岃屾寔涔呭寲鐨勬柟寮忓嵈涓嶄細濡傛棰戠箒鐨勫彉鍖栵紝騫朵笖鍙樺寲鐨勫師鍥犱篃鏄畬鍏ㄤ笉鍚岀殑銆傚鏋滄妸涓氬姟瑙勫垯鍜屾寔涔呭寲鏂瑰紡緇戝畾鍒頒竴璧鳳紝 灝變細涓轟互鍚庣殑寮鍙戙佺淮鎶ら犳垚楹葷儲銆傝繍鐢ㄥ垎灞傦紙layer錛夋灦鏋勬ā寮忔垨鑰匱DD寮鍙戞柟寮忓彲浠ュ緢鏃╁垎紱昏繖涓や釜鑱岃矗錛岀壒孌婃儏鍐典笅錛岃繕鍙互浣跨敤FACADE鎴栬? PROXY妯″紡瀵硅璁¤繘琛岄噸鏋勶紝鍒嗙榪欎袱涓亴璐c?br>
寮闂師鍒欙紙OCP : The Open-Close Principle)

鎻忚堪錛氳蔣浠跺疄浣擄紙綾匯佹ā鍨嬨佸嚱鏁扮瓑絳夛級搴旇鏄彲浠ユ墿灞曠殑錛屼絾鏄笉鍙慨鏀廣?br>
閬靛驚寮闂師鍒欒璁″嚭鐨勬ā鍧楀叿鏈変袱涓富瑕佺殑鐗瑰緛銆傚畠浠槸錛?br>1. “瀵逛簬鎵╁睍鏄紑鏀劇殑”錛圤pen for extension錛夈?br>   榪欐剰鍛崇潃妯″潡鐨勮涓烘槸鍙互鎵╁睍鐨勩傚綋搴旂敤鐨勯渶瑕佹敼鍙樻椂錛屾垜浠彲浠ュ妯″潡榪涜鎵╁睍錛屼嬌鍏跺叿鏈夋弧瓚抽偅浜涙敼鍙樼殑鏂拌涓恒傛崲鍙ヨ瘽璇達紝鎴戜滑鍙互鏀瑰彉妯″潡鐨勫姛鑳姐?br>2. “瀵逛簬鏇存敼鏄皝闂殑”錛圕losed for modification錛夈?br>   瀵規ā鍧楄涓鴻繘琛屾墿灞曟椂錛屼笉蹇呮敼鍔ㄦā鍧楃殑婧愪唬鐮佹垨鑰呬簩榪涘埗浠g爜銆傛ā鍧楃殑浜岃繘鍒跺彲鎵ц鐗堟湰錛屾棤璁烘槸鍙摼鎺ョ殑搴撱丏LL鎴栬匤ava鐨?jar鏂囦歡錛岄兘鏃犻渶鏀瑰姩銆?br>
瀵逛簬OCP錛屽叧閿殑鏄? 鎶借薄
妯″潡鍙互鎿嶄綔涓涓娊璞′綋銆傜敱浜庢ā鍧椾緷璧栦簬涓涓浐瀹氱殑鎶借薄浣擄紝鎵浠ュ畠瀵逛簬鏇存敼鍙互鏄叧闂殑銆傚悓鏃訛紝閫氳繃浠庤繖涓娊璞′綋媧劇敓錛屼篃鍙互鎵╁睍姝ゆā鍧楃殑琛屼負銆?br>
鍦ㄨ澶氭柟闈紝OCP閮芥槸闈㈠悜瀵硅薄璁捐鐨勬牳蹇冩墍鍦ㄣ備絾瀹為檯搴旂敤涓紝婊ョ敤OCP鍘熷垯涔熸槸閿欒鐨勩傛紜殑鍋氭硶鏄簲璇ヤ粎浠呭紼嬪簭涓憟鐜板嚭棰戠箒鍙樺寲鐨勯偅浜涢儴鍒嗗仛鍑烘娊璞°傛嫆緇濅笉鎴愮啛鐨勬娊璞″拰鎶借薄鏈韓涓鏍烽噸瑕併?/div>

Liskov鏇挎崲鍘熷垯錛圠SP錛?/font>

鎻忚堪錛氬瓙綾誨瀷錛坰ubtype錛夊繀欏昏兘澶熸浛鎹㈡帀瀹冧滑鐨勫熀綾誨瀷錛坆ase type錛夈?br>
姝ゅ師鍒欐槸Barbara Liskov棣栨鍦?988騫村啓涓嬬殑銆傛墍浠ュ氨鍙仛Liskov鏇挎崲鍘熷垯銆傚ス濡傛鍐欏埌錛?br>“榪欓噷闇瑕佸涓嬫浛鎹㈡ц川錛氳嫢瀵規瘡涓被鍨婼鐨勫璞1錛岄兘瀛樺湪涓涓被鍨婽鐨勫璞2錛屼嬌寰楀湪鎵鏈夐拡瀵筎緙栧啓鐨勭▼搴廝涓紝鐢╫1鏇挎崲o2鍚庯紝紼嬪簭P琛屼負鍔熻兘涓嶅彉錛屽垯S鏄疶鐨勫瓙綾誨瀷銆?br>
LSP鐒舵垜浠緱鍑轟竴涓潪甯擱噸瑕佺殑緇撹錛氫竴涓ā鍨嬶紝濡傛灉瀛ょ珛鐨勭湅錛屽茍涓嶅叿鏈夌湡姝f剰涔変笂鐨勬湁鏁堟с傛ā鍨嬬殑鏈夋晥鎬у彧鑳介氳繃瀹冪殑瀹㈡埛紼嬪簭鏉ヨ〃鐜般?br>
鍦ㄨ冭檻涓涓壒瀹氳璁℃槸鍚︽伆褰撴椂錛屼笉鑳藉畬鍏ㄥ绔嬬殑鏉ョ湅榪欎釜瑙e喅鏂規銆傚繀欏昏鏍規嵁璇ヨ璁$殑浣跨敤鑰呮墍鍋氬嚭鐨勫悎鐞嗗亣璁炬潵瀹¤瀹冦?br>
鏈? 璋佺煡閬撹璁$殑浣跨敤鑰呬細鍋氬嚭浠涔堟牱鐨勫悎鐞嗗亣璁懼憿錛熷ぇ澶氭暟榪欐牱鐨勫亣璁鵑兘寰堥毦棰勬祴銆備簨瀹炰笂錛屽鏋滆瘯鍥懼幓棰勬祴鎵鏈夎繖浜涘亣璁撅紝鎴戜滑鎵寰楀埌鐨勭郴緇熷緢鍙兘浼氬厖婊′笉蹇呰鐨? 澶嶆潅鎬х殑鑷懗銆傚洜姝わ紝鍍忔墍鏈夊叾瀹冨師鍒欎竴鏍蜂簡錛岄氬父鏈濂界殑鍔炴硶灝辨槸鍙嫻嬮偅浜涙渶鏄庢樉鐨勫浜嶭SP鐨勮繚鍙嶆儏鍐碉紝鑰屾帹榪熸墍鏈夊叾瀹冪殑棰勬祴錛岀洿鍒板嚭鐜扮浉鍏崇殑鑴嗗急鎬х殑 鑷懗鏃訛紝鎵嶅幓澶勭悊瀹冧滑銆?br>
IS-A鏄叧浜庤涓虹殑銆?/font>
LSP娓呮櫚鐨勬寚鍑猴紝OOD涓璉S錛岮鍏崇郴鏄氨琛屼負鏂瑰紡鑰岃█鐨勶紝琛屼負鏂瑰紡鏄彲浠ヨ繘琛屽悎鐞嗗亣璁劇殑錛屾槸瀹㈡埛紼嬪簭鎵渚濊禆鐨勩?br>
鍩轟簬濂戠害璁捐
鍩? 浜庡綰﹁璁★紙DBC錛欴esign By Contract錛夈備嬌鐢―BC錛岀被鐨勭紪鍐欒呰兘澶熸樉寮忕殑瑙勫畾閽堝璇ョ被鐨勫綰︺傚鎴蜂唬鐮佺殑緙栧啓鑰呭彲浠ラ氳繃璇ュ綰﹁幏鎮夊彲浠ヤ緷璧栫殑琛屼負鏂瑰紡銆傚綰︽槸閫氳繃涓烘瘡涓柟 娉曞0鏄庣殑鍓嶇疆鏉′歡錛坧reconditions)鍜屽悗緗潯浠訛紙postconditions)鏉ユ寚瀹氱殑銆傝浣夸竴涓柟娉曞緱浠ユ墽琛岋紝鍓嶇疆鏉′歡蹇呴』瑕佷負鐪熴傛墽琛? 瀹屾瘯鍚庯紝璇ユ柟娉曡淇濊瘉鍚庣疆鏉′歡涓虹湡銆?br>
鍦ㄥ崟鍏冩祴璇曚腑鎸囧畾濂戠害
涔熷彲浠ラ氳繃緙栧啓鍗曞厓嫻嬭瘯鐨勬柟寮忔潵鎸囧畾濂戠害銆傚鎴蜂唬鐮佺紪鍐欒呬細鍘繪煡鐪嬭繖浜涘崟鍏冩祴璇曪紝榪欐牱浠栦滑灝卞彲浠ョ煡閬撳浜庤浣跨敤鐨勭被錛屽簲璇ュ仛浠涔堝悎鐞嗙殑鍋囪銆?br>
鍚彂寮忚鍒欏拰涔犳儻鐢ㄦ硶

1.媧劇敓綾諱腑鐨勯鍖栧嚱鏁?br>  鍦ㄥ熀綾諱腑瀹炵幇浜唂()鏂規硶錛屽湪媧劇敓綾諱腑鐨勫嚱鏁癴()灝辨槸閫鍖栫殑錛屾淳鐢熺被涓殑閫鍖栧嚱鏁板茍涓嶆昏〃紺轟負榪濆弽LSP錛屼絾鏄綋瀛樺湪榪欑鎯呭喌鏃訛紝榪樻槸鍊煎緱娉ㄦ剰涓涓嬬殑銆?br>2.浠庢淳鐢熺被涓姏鍑哄紓甯?br>  鍦ㄦ淳鐢熺被鐨勬柟娉曚腑娣誨姞浜嗗叾鍩虹被涓嶄細鎶涘嚭鐨勫紓甯搞傚鏋滃熀綾葷殑浣跨敤鑰呬笉鏈熸湜榪欎簺寮傚父錛岄偅涔堟妸瀹冧滑娣誨姞鍒版淳鐢熺被鐨勬柟娉曚腑灝變細瀵艱嚧涓嶅彲鏇挎崲鎬с傛鏃惰閬靛驚LSP錛岃涔堝氨蹇呴』鏀瑰彉浣跨敤鑰呯殑鏈熸湜錛岃涔堟淳鐢熺被灝變笉搴旇鎶涘嚭榪欎簺寮傚父銆?br>
鎬? 緇擄細OCP鏄疧OD涓緢澶氬師鍒欑殑鏍稿績銆傚鏋滆繖涓師鍒欏簲鐢ㄧ殑鏈夋晥錛屽簲鐢ㄧ▼搴忓氨浼氬叿鏈夋洿澶氱殑鍙淮鎶ゆс佸彲閲嶇敤鎬т互鍙婂仴澹с侺SP鏄嬌OCP鎴愪負鍙兘鐨勪富瑕佸師 鍒欎箣涓銆傛鏄瓙綾誨瀷鐨勫彲鏇挎崲鎬ф墠浣垮緱浣跨敤鍩虹被綾誨瀷鐨勬ā鍧楀湪鏃犻渶淇敼鐨勬儏鍐典笅灝卞彲浠ユ墿灞曘傝繖縐嶅彲鏇挎崲鎬у繀欏繪槸寮鍙戜漢鍛樺彲浠ラ殣寮忎緷璧栫殑銆傚洜姝わ紝濡傛灉娌℃湁鏄懼紡鐨? 寮哄埗鍩虹被綾誨瀷鐨勫綰︼紝閭d箞浠g爜灝卞繀欏昏壇濂界殑騫朵笖鏄庢樉鐨勮〃杈懼嚭榪欎竴鐐廣?br>      鏈IS-A鐨勫惈涔夎繃浜庡箍娉涗互鑷充簬涓嶈兘浣滀負瀛愮被鍨嬬殑瀹氫箟銆傚瓙綾誨瀷鐨勬紜畾涔夋槸“鍙浛鎹㈡?#8221;錛岃繖閲岀殑鍙浛鎹㈡у彲浠ラ氳繃鏄懼紡鎴栬呴殣寮忕殑濂戠害鏉ュ畾涔夈?/div>

浣滆匓log錛?/strong>http://blog.csdn.net/nirvana_li/


RichardHe 2008-05-14 13:21 鍙戣〃璇勮
]]>鐞嗚В: 闈㈠悜瀵硅薄鐨勮璁″師鍒欎笌璁捐妯″紡http://m.shnenglu.com/richardhe/articles/49794.htmlRichardHeRichardHeWed, 14 May 2008 02:37:00 GMThttp://m.shnenglu.com/richardhe/articles/49794.htmlhttp://m.shnenglu.com/richardhe/comments/49794.htmlhttp://m.shnenglu.com/richardhe/articles/49794.html#Feedback0http://m.shnenglu.com/richardhe/comments/commentRss/49794.htmlhttp://m.shnenglu.com/richardhe/services/trackbacks/49794.html璁板緱2004騫村垰鎺ヨЕ璁捐妯″紡錛屼拱浜嗙粡鍏哥殑<<璁捐妯″紡>>涓涔︼紝緇嗙粏鍦伴槄璇伙紝鐒跺悗鍦ㄥ紑鍙戜腑妯′豢銆備竴涓ゅ勾鏃墮棿榪囧幓錛屽23縐嶈璁? 妯″紡寮勫緱榪樼畻姣旇緝鐔熸倝錛屼篃鍦ㄨ蔣浠惰璁′腑鑳界敤鍒欑敤錛屾瘮濡係ingleton, template method, proxy, facade絳夌瓑銆備絾鎬繪劅瑙夌敤鐨勪笉鐖斤紝褰撴椂涔熻涓嶅嚭鍘熷洜錛涘氨鏄劅瑙夊湪浣跨敤鐨勮繃紼嬩腑錛屾槸涓縐嶄負浜嗕嬌鐢ㄨ璁℃ā寮忚屼嬌鐢ㄤ笂浠栦滑錛屾湁鏃跺欐槸鐢熸惉紜銆傛諱箣錛岃嚜宸卞綋 鏃舵槸鎼炰笉娓呮涓轟粈涔堣浣跨敤璁捐妯″紡錛屽仠鐣欏湪鍒漢璇村畠鐗涳紝鎴戝氨瀛︾潃鐢ㄨ屼笉钀戒漢涔嬪悗銆?
    鎴戜笉鏄竴涓ぉ璐ㄨ仾棰栫殑浜猴紝瀵硅蔣浠惰璁$殑鐞嗚В錛屽熀鏈笂鏃犳硶璇勮嚜宸辮兘鍔涘崟鐙鎮熷嚭鏉ャ傚彧鏈夊父甯哥潱淇冭嚜宸卞涔板浗鍐呭杞歡涓撳鍐欑殑濂戒功錛屾潵瀛︿範浠栦滑鍦ㄨ繖浜涙柟闈㈢殑鍙戠幇鍜屾葷粨銆傞潬鍚庡ぉ瀛︿範鏉ュ譏琛ュ厛澶╀笉瓚籌紝涔熸槸娌℃湁鍔炴硶涓殑鍔炴硶銆?br>    緇堜簬鍦?007騫寸湅鍒頒簡<<java涓庢ā寮?gt;>錛? 涔︿腑瀵硅璁℃ā寮忕殑璁ㄨ錛屽茍娌℃湁鐗瑰埆鍚稿紩鎴戠殑鍦版柟錛屼笉榪囨槸鐢╦ava璇█鏉ヨ緇嗚瑙?3縐嶆ā寮忚屽凡錛屾渶澶氬鍔犱竴浜涘彉浣撱傛繁娣卞惛寮曟垜鐨勬槸"絎簩閮ㄥ垎 闈㈠悜瀵硅薄鐨勮璁″師鍒?錛? 榪欎竴閮ㄥ垎铏界劧綃囧箙涓嶅錛屼絾娓呮櫚鍦拌鏄庝簡鎴戜滑涓轟粈涔堣鐢ㄨ璁℃ā寮忥紝浣跨敤璁捐妯″紡鏄潵瑙e喅浠涔堥棶棰樼殑錛屼嬌鐢ㄤ箣鍚庢垜浠杈懼埌浠涔堟晥鏋溿傝蔣浠剁殑鐢熷懡鍛ㄦ湡璁╂垜浠璇? 鍒幫紝闈㈠悜瀵硅薄鐨勮璁¤瑙e喅鐨勬牳蹇冮棶棰樻槸鍙淮鎶ゆу拰鍙鐢ㄦэ紝鐗瑰埆鏄彲緇存姢鎬э紝涓涓ソ杞歡鐨勭淮鎶ゆ垚鏈繙榪滃ぇ浜庡垵鏈熷紑鍙戞垚鏈?br>    涓涓蔣浠惰璁$殑鍙淮鎶ゆу緢宸紝鍘熷洜鍦ㄤ簬錛氳繃浜庡兊紜佽繃浜庤剢寮便佸鐢ㄧ巼浣庛侀粡搴﹁繃楂樸傜浉鍙嶏紝涓涓ソ鐨勭郴緇熻璁″簲璇ユ槸鍙墿灞曠殑銆佺伒媧葷殑銆佸彲鎻掑叆鐨勩傚湪杞歡鍙戣揪 鍥藉濡傜編鍥斤紝涓浜涜蔣浠剁晫鐨勯珮鎵嬶紝鍦?0涓栫邯80~90騫翠唬錛屽氨闄嗙畫鎻愬嚭涓浜涜璁″師鍒欙紝榪欎簺璁捐鍘熷垯鏄湪鎻愰珮涓涓郴緇熺殑鍙淮鎶ゆх殑鍚屾椂錛屾彁楂樼郴緇熺殑鍙鐢ㄦ? 鐨勬寚瀵煎師鍒欙細
    1銆佸紑闂師鍒欙細杞歡鏋舵瀯搴旇鏄鎵╁睍寮鍙戯紝瀵逛慨鏀瑰叧闂?br>    2銆丩iskov鏇挎崲鍘熷垯錛氫換浣曞熀綾誨彲浠ュ嚭鐜扮殑鍦版柟錛屽瓙綾諱竴瀹氬彲浠ュ嚭鐜?br>    3銆佷緷璧栧掕漿鍘熷垯錛氳渚濊禆浜庢娊璞★紝涓嶈渚濊禆浜庡疄鐜?br>    4銆佹帴鍙i殧紱誨師鍒欙細搴斿綋涓哄鎴鋒彁渚涘敖鍙兘灝忕殑鎺ュ彛錛岃屼笉鏄彁渚涘ぇ鐨勬帴鍙c?br>    5銆佺粍鍚堛佽仛鍚堝鐢ㄥ師鍒欙細瑕佸敖閲忎嬌鐢ㄧ粍鍚堛佽仛鍚堬紝鑰屼笉鏄戶鎵垮叧緋諱互杈懼埌澶嶇敤鐨勭洰鐨勩?br>    6銆丏emeter娉曞垯錛氫竴涓蔣浠跺疄浣撳簲璇ヤ笌灝藉彲鑳藉皯鐨勫叾浠栧疄浣撳彂鐢熶簰鐩鎬綔鐢ㄣ?br>    鍙互璇達紝<<java涓庢ā寮?gt;>閲屽緢濂界殑瑙e喅浜嗘垜蹇冧腑涓や笁騫存潵鐨勪笉蹇紝璁╂垜鐪熸鐞嗚В浜嗕負浠涔堣浣跨敤璁捐妯″紡銆傝蔣浠跺紑鍙戙佽璁″師鍒? 涓庤璁℃ā寮忕殑鍏崇郴錛屾垜涓嶆伆褰撶殑姣斿柣涓烘垬浜夈佹垬鐣ヤ笌鎴樻湳鐨勫叧緋伙紱瑕佸彇寰楁垬浜夌殑鍏ㄩ潰鑳滃埄錛屼綘棣栧厛瑕佸湪鎴樼暐涓婃妸鎻″ソ錛岀劧鍚庢墠鏄垬鏈笂鎸囨尌濂斤紱鍚屾牱錛岃寮鍙戝嚭濂界殑 杞歡錛屾垜浠鍏堣閬靛驚涓瀹氱殑璁捐鍘熷垯錛屼負浜嗚揪鍒版垜浠殑鐩殑錛屽湪寮鍙戜腑鎴戜滑灝辨伆褰撶殑浣跨敤鐩稿簲鐨勮璁℃ā寮忋?br>    <<java涓庢ā寮?gt;>鍐欑殑濂斤紝鑰屼笖鏄腑鍥戒漢鍐欑殑錛屼絾瀹冪己灝戜簡涓涓柟闈㈢殑鎻忚堪錛氭垜浠庢牱鍦ㄥ疄闄呯殑璁捐寮鍙戜腑鍋氬埌榪欎簺鍛紵鏄笉鏄竴寮濮嬪氨瑕侀伒寰繖浜涜璁″師鍒欙紝灝辮浣跨敤璁捐妯″紡錛熻繕鏄湁涓涓粈涔堟牱鐨勮繃紼嬶紵
    緇堜簬浠婂勾鍒濈湅鍒頒簡鑻辨枃鐗?lt;<鏁忔嵎杞歡寮鍙戯細鍘熷垯銆佹ā寮忎笌瀹炶返>>錛? 鍥藉榪欎簺澶х墰灝辨槸澶х墰錛屽湪榪欐柟闈㈠氨鏄悊瑙f繁鍒伙紝瀹炶返緇忛獙涓板瘜銆備綔鑰呯殑瑙傜偣寰堟湁鐐瑰敮鐗╄鯨璇佹硶錛屽氨鏄蔣浠惰璁″紑濮嬫椂錛屾垜浠鏋滄病鏈夌湅鍑烘娊璞$殑蹇呰錛屽彲浠ュ厛瀹炵幇 涓涓畝鍗曠殑錛屽綋絎竴嬈¤闇姹傝Е鍙戣屾樉鐜板嚭鎶借薄鐨勫繀瑕佹椂錛屾垜浠繖鏃舵満浼氬氨鏉ヤ簡錛岄渶瑕佸緢蹇彁鍙栨娊璞℃帴鍙o紝閬靛驚浠ヤ笂璁捐鍘熷垯銆傚綋鐒訛紝浣滆呰繕鏈夊緢澶氬叾瀹冨ソ鐨勬濇兂錛? 榪欓噷涓嶄竴涓鍒椾婦銆?br>    璁よ瘑鍜岀悊瑙i兘闇瑕佷竴涓繃紼嬶紝娌℃湁鐞嗚錛屾垜浠繖浜涙櫤鍟嗕竴鑸殑浜烘槸寰堥毦浠呬粎鍦ㄩ」鐩紑鍙戜腑灝藉揩鎻愰珮鐨勶紱鍚屾牱錛屽厜鐪嬩功涓嶅疄璺碉紝鎴戜滑涔熷緢闅劇湡姝g悊瑙h繖浜涘埆浜烘葷粨鐨勭粡楠岋紝閭e皢鏄浘閲岀湅鑺便?br>    涓板瘜緇忛獙鍜岃蔣浠惰璁℃濇兂浠ュ強杞歡宸ョ▼鎬濇兂錛屽杞歡寮鍙戠殑閲嶈鎬х湡鐨勬槸濡傛閲嶈錛屾笉寰楁垜浠浗瀹舵棤娉曞紑鍙戝嚭澶у瀷鐨勯珮璐ㄩ噺鐨勮蔣浠舵潵銆?br>


RichardHe 2008-05-14 10:37 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲人成在线观看网站高清| 国产精品久久久免费| 午夜精品一区二区三区电影天堂| 国产欧美日韩一区二区三区| 国产精品ⅴa在线观看h| 欧美日韩在线直播| 免播放器亚洲一区| 午夜视黄欧洲亚洲| 午夜久久资源| 国产午夜精品麻豆| 久久亚洲私人国产精品va| 久久精品国产综合| 欧美日韩国产区| 欧美伊人久久久久久午夜久久久久| 亚洲夜晚福利在线观看| 亚洲第一精品在线| 亚洲黄色影院| 欧美在线首页| 欧美成人午夜影院| 尹人成人综合网| 亚洲精品欧美日韩| 美女诱惑一区| 亚洲一区二区高清| 久久精品国产清高在天天线| 欧美成人资源网| 亚洲专区欧美专区| 欧美激情在线观看| 宅男66日本亚洲欧美视频| 亚洲欧洲一区二区三区在线观看| 亚洲国产高清在线| 小嫩嫩精品导航| 国产精品视频大全| 久久久国产午夜精品| 午夜精品一区二区三区在线视 | 在线欧美视频| 亚洲高清资源综合久久精品| 国产农村妇女精品一区二区| 亚洲精品国产精品国自产在线| 一区二区三区国产精品| 欧美激情国产日韩| 日韩一级黄色av| 亚洲激情精品| 欧美人妖另类| 久久综合色影院| 欧美成人一区在线| 亚洲影视中文字幕| 欧美色图天堂网| 欧美日韩系列| 欧美视频一区在线| 欧美国产日本韩| 久久成人免费日本黄色| 国产一区视频在线观看免费| 男人插女人欧美| 欧美黑人国产人伦爽爽爽| 欧美丝袜一区二区三区| 欧美一区二区日韩| 蜜桃精品久久久久久久免费影院| 亚洲人精品午夜| 日韩一级片网址| 一区二区在线视频观看| 一本一本久久| 国精品一区二区| 亚洲一区二区综合| 亚洲无人区一区| 欧美成人国产va精品日本一级| 99视频在线观看一区三区| 中文网丁香综合网| 在线一区亚洲| 欧美激情一区二区三区| 久久久国产精品亚洲一区| 99视频精品全部免费在线| 国产精品精品视频| 亚洲人成在线播放| 国产亚洲精品一区二555| 亚洲精品网站在线播放gif| 激情丁香综合| 久久亚洲视频| 老司机精品视频一区二区三区| 国产欧美日韩精品丝袜高跟鞋| 亚洲国产欧美日韩另类综合| 在线视频国产日韩| 欧美jjzz| 亚洲激情图片小说视频| 一本色道久久综合亚洲精品小说 | 亚洲影视九九影院在线观看| 国产视频自拍一区| 久久亚洲美女| 欧美一区二区在线播放| 亚洲少妇一区| 免费久久99精品国产自| 亚洲欧美日韩人成在线播放| 久久久99国产精品免费| 美女露胸一区二区三区| 欧美一级电影久久| 亚洲欧美一区二区激情| 欧美在线视频免费| 久久国产黑丝| 欧美一区二区三区视频在线| 在线亚洲激情| 亚洲欧美日韩在线播放| 亚洲欧美日韩视频二区| 亚洲精品亚洲人成人网| 一色屋精品视频在线观看网站| 欧美日韩国产123| 欧美精品亚洲精品| 夜夜爽www精品| 久久综合九色99| 久久只有精品| 美日韩在线观看| 欧美福利视频网站| 免费观看不卡av| 久久久国产一区二区| 亚洲淫性视频| 亚洲欧美制服中文字幕| 午夜精品在线观看| 久久福利视频导航| 久久亚洲综合网| 亚洲欧洲一区| 性欧美大战久久久久久久久| 欧美成人性网| 黄色成人av网| 欧美一级大片在线免费观看| 亚洲高清成人| 美脚丝袜一区二区三区在线观看| 午夜精品免费在线| 久久嫩草精品久久久精品一| 欧美本精品男人aⅴ天堂| 欧美日韩亚洲国产精品| 久久精品官网| 亚洲黄网站黄| 久久久国产视频91| 国产精品永久入口久久久| 在线色欧美三级视频| 亚洲欧美日本国产有色| 欧美成人第一页| 欧美伊人久久大香线蕉综合69| 欧美电影免费观看大全| 狠狠色丁香婷综合久久| 亚洲一区二区三区四区中文| 欧美高清视频一区二区| 午夜精品一区二区三区电影天堂| 欧美日韩国产黄| 亚洲黄色片网站| 亚洲第一黄色网| 免费不卡在线视频| 亚洲激情社区| 久久美女艺术照精彩视频福利播放| 亚洲精品一区二区三| 亚洲一区制服诱惑| 欧美日韩国产小视频在线观看| 黄色精品免费| 欧美91视频| 日韩视频免费| 日韩一区二区福利| 欧美日韩中文字幕在线| 99re成人精品视频| 亚洲激情专区| 久久夜色撩人精品| 欧美二区不卡| 久久综合激情| 亚洲精选久久| 午夜天堂精品久久久久 | 狠狠v欧美v日韩v亚洲ⅴ| 午夜精品免费在线| 香蕉乱码成人久久天堂爱免费| 国产美女精品在线| 久久精品综合网| 久久久最新网址| 欧美中文字幕不卡| 亚洲成人在线视频播放| 欧美一二三视频| 久久久亚洲高清| 99pao成人国产永久免费视频| av成人免费在线| 精品1区2区| 亚洲尤物视频在线| 亚洲精品永久免费| 久久精品男女| 欧美亚洲一区| 国产精品久久久久久av下载红粉| 久久久www成人免费精品| 欧美日本在线看| 亚洲国产精品va在线观看黑人| 欧美视频免费在线| 亚洲精品免费在线观看| 尤妮丝一区二区裸体视频| 亚洲一级在线| 亚洲天堂黄色| 欧美色一级片| 99re6热只有精品免费观看| 韩国三级电影一区二区| 一区二区免费在线播放| 日韩写真视频在线观看| 理论片一区二区在线| 久久综合狠狠综合久久综合88| 欧美日本一区二区三区| 亚洲日本中文字幕区| 亚洲精品在线三区| 欧美大片专区| 亚洲人成人一区二区在线观看|