锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
聽聽聽 聽聽聽 鍦–/C++涓?鍙橀噺鍙婂嚱鏁扮殑瀹氫箟涓鑸兘鏄湪.h/.hpp鏂囦歡涓鏄庡師鍨?鑰屽湪瀵瑰簲鐨?c/.cpp鏂囦歡涓潵榪涜瀹炵幇.
聽聽聽 聽聽聽 榪欑鎯呭喌涓?澶存枃浠舵渶緇堟槸緇欑敤鎴蜂嬌鐢ㄧ殑,浠ヤ究璁╃敤鎴蜂簡瑙f湁鍝簺鎺ュ彛鍙互浣跨敤;鑰?c/.cpp鏂囦歡鏄紑鍙戣呬嬌鐢ㄧ殑,浠ヤ究璁╁叾瀹冨紑鍙戜漢鍛樹簡瑙e畠鐨勫疄鐜伴昏緫.鍥犳榪欎袱涓枃浠朵腑鑲畾閮芥槸闇瑕佽緇嗙殑娉ㄩ噴鐨?鍦?h/.hpp鏂囦歡涓?涓昏璇存槑鍑芥暟鐨勪嬌鐢ㄦ柟娉?濡傚弬鏁扮殑鎰忎箟,榪斿洖鍊肩殑瀹氫箟絳?鑰?c/.cpp鏂囦歡涓?涓昏璇存槑鍑芥暟鐨勫疄鐜伴昏緫絳?
聽聽聽 聽聽聽 涓嶇煡閬撲笂闈㈢殑鍋氭硶鏄惁鍚堥?璇峰ぇ瀹舵寚姝?
聽聽聽 聽聽聽 鍙﹀,澶у鍦ㄥ疄闄呯紪紼嬭繃紼嬩腑鏄浣曞仛鐨?
聽聽聽 聽聽聽 浜嬪疄涓?鎴戣嚜宸卞湪瀹炶返榪囩▼涓嵈鎬繪槸鍋忓悜浜庢妸娉ㄩ噴鍐欏埌涓涓湴鏂?鎴栬呮敞閲婂師鍨?鎴栬呮敞閲婂疄鐜?鍓嶈呮瘮杈冨),鐢氳嚦騫茶剢涓よ竟閮藉啓涓鏍風殑(浣嗚繖鏍風殑璇濆唴瀹圭粡甯鎬細涓嶄竴鏍?.榪欐牱鐨勬柟娉曡鎴戝湪緙栫▼榪囩▼涓悆灝戒簡鑻﹀ご鍝?
]]>C++緙栫爜瑙勮寖
涓銆佺粍緇囦笌絳栫暐闂
If builders built buildings the way programmers wrote programs, then the
鍦–鍜孋++鐨勪富瑕佷紶緇熶腑,鎴戜滑璁や負鏄竴縐嶉浂鍩虹鐨勪範鎯?絎?鏉℃槸涓涓牴鏈殑鎸囩ず,瀹冩兜鐩栦簡緙栫爜瑙勮寖涓垜浠涓烘槸鏈鍩烘湰鐨勫緩璁?
first woodpecker that came along would destroy civilization.
鍦ㄨ繖浠嬬粛鎬х殑涓鑺傜殑鍏朵綑閮ㄥ垎涓?鎴戜滑綺懼績閫夊彇浜嗗叾涓殑灝戦噺闂鍔犱互闃愯堪,榪欎簺澶у涓庣紪鐮佹湰韜棤鐩存帴鍏崇郴,浣嗗嵈鏄啓鍑哄彲闈犱唬鐮佺殑鍩烘湰宸ュ叿鍜屾妧鏈?
鍦ㄨ繖涓鑺備腑鎴戜滑璁や負鏈鏈変環鍊肩殑鏄0鏉′笉瑕佸洜灝忓け澶?(鎴?鐭ラ亾浠涔堜笉闇瑕佽鑼冨寲.)
0. 涓嶈鍥犲皬澶卞ぇ. (鎴?鐭ラ亾浠涔堜笉闇瑕佽鑼冨寲.)
鎽樿
浠呰蹇呰鐨勮瘽:涓嶈鍧氭寔涓漢鍝佸懗鎴栭檲鏃х殑涔犳儻.
璁ㄨ
鐪熷彧鏄釜浜哄搧鍛充笖涓嶅獎鍝嶆紜ф垨鍙鎬х殑緇撹涓嶅睘浜庣紪鐮佹爣鍑?浠諱綍涓撲笟紼嬪簭鍛樺彲浠ュ緢瀹規槗鍦拌鍐欑◢寰笉鍚屼簬浠栨墍涔犳儻鐨勬牸寮忕殑浠g爜.
鍦ㄦ瘡涓簮鏂囦歡鐢氳嚦姣忎釜宸ョ▼涓兘瑕佺敤涓鑷寸殑鏍煎紡,鍥犱負鍦ㄥ嚑縐嶄笉鍚岀紪鐮侀鏍肩殑浠g爜鐗囨涓煩杞槸寰堜笉鍗忚皟鐨?浣嗘槸涓嶈浼佸浘鍦ㄤ笉鍚岄」鐩垨鍏徃涓潥鎸佷竴鑷村湴鏍煎紡.
涓嬮潰鏄嚑鏉¢氱敤鐨勭粨璁?榪欓噷閲嶈鐨勪笉鏄幓鍒跺畾瑙勫垯,鑰屽彧鏄淇濇寔涓庝綘緇存姢鐨勬枃浠剁殑椋庢牸鐨勪竴鑷?
涓嶅繀鏄庣‘鎸囧畾瑕佺緝榪涘灝?浣嗚緙╄繘浠ョ獊鍑虹粨鏋?鐢ㄤ綘鍠滄鐨勪換鎰忔暟閲忕殑絀烘牸緙╄繘,浣嗚嚦灝戣鍦ㄥ悓涓鏂囦歡涓繚鎸佷竴鑷?
涓嶅繀寮鴻淇濇寔鐗瑰畾鐨勮闀垮害,浣嗚淇濇寔琛屽叿鏈夊彲璇繪?鐢ㄤ綘鍠滄鐨勪換鎰忛暱搴︾殑琛岄暱,浣嗕笉瑕佸お闀夸簡.鐮旂┒琛ㄦ槑鍗佷釜鍗曡瘝浠ュ唴鐨勫搴﹀鐪肩潧璺熻釜鏄渶鐞嗘兂鐨?
涓嶈榪囧害鍒跺畾鍛藉悕瑙勫垯,浣嗚鐢ㄤ竴鑷寸殑鍛藉悕綰﹀畾:浠呮湁涓ょ偣蹇呴』瑕佸仛鐨?a)鍐充笉鐢?闅愮鐨?鍚嶇О,涔熷嵆浠ヤ竴涓笅鍒掔嚎寮澶存垨鍖呮嫭鍙屼笅鍒掔嚎鐨勫悕縐?浠ュ強b)鎬繪槸鐢ㄥ瓧姣嶅叏閮ㄥぇ鍐欑殑鍗曡瘝鍛藉悕瀹忓茍涓斿喅涓嶈鑰冭檻瀹氫箟涓涓父鐢ㄦ垨緙╁啓鍗曡瘝鐨勫畯(鍖呮嫭甯哥敤妯℃澘鍙傛暟,姣斿T鍜孶;浠?define T anything瀹氫箟浠諱綍涓滆タ鏄瀬鍏朵笉濂界殑鍋氭硶).姝ゅ,瑕佺敤涓鑷寸殑鏈夋剰涔夌殑鍚嶇О,騫舵寜鐓ф枃浠舵垨妯″潡鐨勭害瀹?(鑻ヤ綘涓嶈兘鍐沖畾浣犺嚜宸辯殑鍛藉悕綰﹀畾,璇曡瘯榪欑鏂瑰紡錛氫互鍚勫崟璇嶉瀛楁瘝澶у啓鏂瑰紡鍛藉悕綾匯佸嚱鏁板拰鏋氫婦(LikeThis);鍛藉悕鍙橀噺鏃跺湪鍓嶈呭熀紜涓婂皬鍐欑涓涓崟璇嶇殑棣栧瓧姣?likeThis);鍛藉悕縐佹湁鎴愬憳鍙橀噺鏃跺湪鍓嶈呮柟寮忎箣鍚庡啀鍔犱竴涓笅鍒掔嚎(linkThis_);浠ュ叏澶у啓騫剁敤涓涓笅鍒掔嚎榪炴帴鍚勫崟璇嶇殑鏂瑰紡鍛藉悕瀹?LINK_THIS).)
涓嶈瑙勫畾娉ㄩ噴鐨勯鏍?闄ら潪鏈夊伐鍏瘋В鏋愮壒瀹氭牸寮忕殑娉ㄩ噴鐢熸垚鏂囨。),浣嗚鍐欐湁鐢ㄧ殑娉ㄩ噴:濡傛灉鍙互鐨勮瘽浠ヤ唬鐮佹潵浠f浛娉ㄩ噴(瑙?a href="#item16">絎?6鏉?/a>).涓嶈鍦ㄦ敞閲婁腑閲嶅浠g爜;瀹冧滑涓嶈兘琚悓姝ョ淮鎶?瑕佸啓瑙i噴鏂規硶鍜屽熀鏈師鐞嗙殑鍚彂鎬х殑娉ㄩ噴.
鏈鍚?涓嶈璇曞浘鍧氭寔闄堟棫鐨勮鍒?瑙?a href="#0_3">渚?鍜?a href="#0_4">渚?),鍗充嬌瀹冧滑鏇懼湪鏃х紪鐮佽鑼冨嚭鐜拌繃.
渚嬪瓙
void using_k_and_r_style() {
浠諱綍涓撲笟紼嬪簭鍛橀兘鍙互涓嶈垂鍔涘湴璇誨啓涓婇潰鎵鍒楃殑浠諱綍涓縐嶉鏍肩殑浠g爜.浣嗚淇濇寔涓鑷存?涓嶈闅忔剰鐨勬垨浠ユ櫐娑╃殑宓屽鏂瑰紡鏀劇疆鎷彿,璇曠潃鍘婚伒寰悇鏂囦歡涓凡鏈夌殑椋庢牸.鍦ㄦ湰涔︿腑,鎴戜滑鐨勬嫭鍙鋒湁鎰忚瘑鐨勫湪鎺掔増鐨勭害鏉熶腑浠ユ渶濂界殑鍙鎬х殑鏉ユ斁緗?
// K&R椋庢牸
}
void putting_each_brace_on_its_own_line()
{
// 鎷彿鐙崰涓琛?br>}
void or_putting_each_brace_on_its_own_line_indented()
{
// 鎷彿鐙崰涓琛屽茍緙╄繘
}鍙傝?/h3>
[BoostLRG] 路 [Brooks95] $12 路 [Constantine95] $29 路 [Keffer95] p. 1 路
[Kernighan99] $1.1, $1.3, $1.6-7 路 [Lakos96] $1.4.1, $2.7 路 [McConnell93]
$9, $19 路 [Stroustrup94] $4.2-3 路 [Stroustrup00] $4.9.3, $6.4, $7.8, $C.1
路 [Sutter00] $6, $20 路 [SuttHysl01]1. 浠ラ珮璀﹀憡綰у埆騫插噣鍦扮紪璇?/h2>
鎽樿
灝嗚鍛婇摥璁頒簬蹇?浣跨敤浣犵殑緙栬瘧鍣ㄧ殑鏈楂樿鍛婄駭鍒?瑕佹眰騫插噣(鏃犺鍛?鐨勬瀯寤?鐞嗚В鍏ㄩ儴鐨勮鍛?騫墮氳繃淇敼浠g爜娑堥櫎璀﹀憡,鑰屼笉鏄氳繃闄嶄綆璀﹀憡綰у埆.
璁ㄨ
緙栬瘧鍣ㄦ槸浣犵殑濂芥湅鍙?鑻ュ畠鐢變簬涓涓壒瀹氱殑緇撴瀯鑰屽彂鍑轟竴涓鍛?閫氬父浣犵殑浠g爜鍚湁娼滃湪鐨勯棶棰?
鎴愬姛鏋勫緩搴旇鏄共鍑鐨?鏃犺鍛婄殑).濡傝嫢涓嶆槸榪欐牱,浣犲皢浼氬緢蹇吇鎴愬揩閫熸祻瑙堣緭鍑虹粨鏋滅殑涔犳儻,榪涜屼綘灝嗛敊榪囩湡姝g殑闂.(瑙?a href="#item2">絎?鏉?/a>)
娑堥櫎璀﹀憡: a)鐞嗚В瀹?鐒跺悗b)鏇存敼浣犵殑浠g爜鍘繪秷闄よ鍛婂茍璁╀綘鎯寵瀹冩墍鍋氱殑浜嬫儏瀵逛漢鍜岀紪璇戝櫒閮芥洿娓呮.
涓瀹氳鍋氳繖涓姝?鍗充嬌涓寮濮嬬▼搴忕湅璧鋒潵姝g‘榪愯浜?鎴栬呭嵆浣夸綘鑲畾璀﹀憡鏄壇鎬х殑.鍗充嬌鏄壇鎬ц鍛婁篃鍙互浣垮悗闈㈢殑鎸囧嚭鐪熸鍗遍櫓鐨勮鍛婂彉寰楅殣鏅?
渚嬪瓙
// 鏂囦歡: myproj/my_lambda.h -- 鍖呰Boost鐨刲ambda.hpp
// 鎬繪槸浣跨敤榪欎釜鏂囦歡,鑰屼笉鐩存帴浣跨敤lambda.hpp.
// 娉ㄦ剰: 鎴戜滑鐨勬瀯寤虹幇鍦ㄨ嚜鍔ㄦ鏌? "grep lambda.hpp
// Boost.Lambda浜х敓鎴戜滑鎵鐭ラ亾鐨勬棤瀹崇殑緙栬瘧璀﹀憡.
// 褰撲綔鑰呬慨姝e畠鏃舵垜浠皢縐婚櫎涓嬮潰鐨?pragma璇彞,浣嗘槸榪欎釜澶存枃浠朵粛灝嗗瓨鍦?
//
#pragma warning(push) // 浠呭睆钄借繖涓ご鏂囦歡
#pragma warning(disable:4512)
#pragma warning(disable:4180)
#include
// 鈥?涓嶄嬌鐢ㄦ彁紺虹殑鐢ㄦ埛鑷畾涔夊垎閰嶅櫒鍐呴儴 鈥?br>
// 璀﹀憡: "unused parameter 'localityHint'"
pointer allocate( size_type numObjects, const void *localityHint = 0 ) {
return static_cast
}
// 鏂扮増鏈? 娑堥櫎璀﹀憡
pointer allocate( size_type numObjects, const void * /* localityHint */ = 0 ) {
return static_cast
}// 璀﹀憡: "鍙橀噺'lock'瀹氫箟浜嗕絾鍗翠粠鏈嬌鐢?"
void Fun() {
Lock lock;
// 鈥?br>
}
// 鏂扮増鏈? 娑堥櫎浜嗚鍛?br>void Fun() {
Lock lock;
lock;
// 鈥?br>
}
// 璀﹀憡: 涓㈠け"return"
int Fun( Color c ) {
switch( c ) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
}
}
// 鏂扮増鏈? 娑堥櫎璀﹀憡
int Fun( Color c ) {
switch( c ) {
case Red: return 2;
case Green: return 0;
case Blue:
case Black: return 1;
default: assert( !"should never get here!" ); // !"string"鐨勫間負false
return -1;
}
}渚嬪
鏈夋椂緙栬瘧鍣ㄥ彲鑳藉彂鍑轟竴涓帉鐑︾殑鐢氳嚦嬈洪獥鎬х殑璀﹀憡(姣斿綰補鐨勬壈涔變俊鎭?,浣嗘病鏈夊彲鎻愪緵鐨勬柟娉曞幓娑堥櫎瀹?鑰屼笖鍘諱慨鏀逛唬鐮佸幓娑堥櫎瀹冨彲鑳芥槸涓嶅彲瀹炵幇鐨勬垨鏄緬鍔崇殑宸ヤ綔.鍦ㄨ繖浜涚綍瑙佺殑鎯呭喌涓?浣滀負涓涓洟闃熷喅絳?闄ゅ幓榪欎釜鍙槸鏃犺亰鐨勮鍛婄殑鐑︿漢鐨勫伐浣滄槸:浠呬嬌鐗瑰畾璀﹀憡鏃犳晥,騫跺敖鍙兘鏄眬閮ㄦх殑,騫跺啓涓涓竻鏅扮殑娉ㄩ噴鏂囨。璇存槑涓轟粈涔堣繖鏍峰仛鏄繀瑕佺殑.
鍙傝?/h3>
[Meyers97] $48 路 [Stroustrup94] $2.6.2
2. 浣跨敤鑷姩鏋勫緩緋葷粺
鎽樿
鎸?鍗曚釜)鎸夐挳:浣跨敤涓涓棤闇鐢ㄦ埛鍙備笌鐨勫叏鑷姩("涓閿Е鍙?)鏋勫緩緋葷粺.
璁ㄨ
涓涓竴閿Е鍙戝紡鏋勫緩鏂規硶鏄熀鏈殑.瀹冨繀欏昏繘琛屽彲闈犵殑鍜屽彲閲嶅鐨勮漿鎹?灝嗕綘鐨勬簮鏂囦歡杞崲涓哄彲浜や粯鐨勭▼搴忓寘.鏈夊緢澶氳嚜鍔ㄦ瀯寤哄伐鍏峰彲浠ヤ嬌鐢?娌℃湁鐞嗙敱涓嶅幓鐢ㄥ畠.鎸戦変竴涓?浣跨敤瀹?
鎴戜滑宸茶榪囦竴浜涘拷瑙嗕簡"涓閿Е鍙?寮忚姹傜殑緇勭粐.涓浜涗漢璁や負闅忓鐐瑰嚑涓嬮紶鏍?灝卞彲浠ヨ繍琛屼竴浜涘伐鍏鋒潵娉ㄥ唽COM/CORBA鏈嶅姟,鎴栭氳繃鎵嬪伐瀹氬埗鐨勪竴涓悎鐞嗘瀯寤鴻繃紼嬫嫹璐濅竴浜涙枃浠?浣嗘槸浣犳病鏈夋椂闂村拰綺懼姏鍙互嫻垂鍦ㄤ竴浜涙満鍣ㄨ兘鍋氬緱鏇村ソ鏇村揩鐨勪簨鎯呬笂.浣犻渶瑕佷竴閿Е鍙戝紡鐨勮嚜鍔ㄥ寲鐨勫拰鍙潬鐨勬瀯寤?
鎴愬姛鐨勬瀯寤哄簲璇ユ槸娌℃湁浠諱綍璀﹀憡鐨?瑙佺1鏉?.鐞嗘兂鍖栫殑鏋勫緩涓嶄駭鐢熸壈涔變俊鎭?鑰屼粎鏄竴涓棩蹇楁秷鎭?"鏋勫緩鎴愬姛瀹屾垚."
鏈変袱涓瀯寤烘ā寮?澧為噺鏋勫緩鍜屽畬鍏ㄦ瀯寤?澧為噺鏋勫緩浠呴噸寤鴻嚜涓婅嚜澧為噺鏋勫緩鎴栧畬鍏ㄦ瀯寤轟互鏉ヨ淇敼榪囩殑鏂囦歡.鎺ㄨ:涓や釜榪炵畫鐨勫閲忔瀯寤轟腑鐨勫悗鑰呭簲璇ユ病鏈変換浣曡緭鍑烘枃浠?濡傛灉鏈夌殑璇?浣犲彲鑳芥湁涓涓緷璧栫幆(瑙佺22鏉?,鎴栬呬綘鐨勬瀯寤虹郴緇熸墽琛屼簡涓嶅繀瑕佺殑鎿嶄綔(渚嬪鐢熸垚涓嶅悎鐞嗙殑涓存椂鏂囦歡鑰屽彧鏄涪寮冨畠浠?.
涓涓伐紼嬪彲浠ユ湁涓嶅悓褰㈠紡鐨勫畬鍏ㄦ瀯寤?鑰冭檻鐢ㄤ竴緋誨垪鏈川鐨勭壒寰佺‘瀹氫綘鐨勬瀯寤虹殑鍙傛暟;寰堝彲鑳藉欓夎呭氨鏄洰鏍囧紡浣撶郴緇撴瀯銆佽皟璇曞拰鍙戝竷銆佹垨鏇村箍(鍩烘湰鏂囦歡鍜屽叏閮ㄦ枃浠跺拰瀹屽叏瀹夎).涓涓瀯寤鴻緗彲浠ュ垱寤轟竴涓駭鍝佺殑鍩烘湰鐨勫彲鎵ц鏂囦歡鍜屽簱,鍙︿竴涓彲鑳戒篃鍒涘緩涓浜涜緟鍔╂枃浠?涓涓畬鍏ㄥ厖瀹炵殑鏋勫緩涔熷彲鑳藉垱寤轟竴涓寘鍚綘鎵鏈夋枃浠躲佸彲閲嶅彂甯冪殑絎笁鏂瑰簱鍜屽畨瑁呬唬鐮佺殑瀹夎紼嬪簭.
闅忕潃宸ョ▼鐨勮繘琛?娌℃湁鑷姩鏋勫緩鐨勮姳璐逛篃鍦ㄥ闀?濡傛灉浣犱竴寮濮嬫病鏈夌敤,浣犲皢嫻垂寰堝鏃墮棿鍜岃祫婧?鏇寸碂緋曠殑鏄?闅忕潃鑷姩鏋勫緩鎴愪負鏃犳硶鎶墊姉鐨勯渶姹?浣犲皢浼氭湁姣旈」鐩竴寮濮嬫洿澶氱殑鍘嬪姏.
澶ч」鐩彲鑳芥湁涓涓?鏋勫緩甯?涓葷",浠栫殑宸ヤ綔灝辨槸鐓ф枡鏋勫緩緋葷粺.
鍙傝?/h3>
[Brooks95] $13, $19 路 [Dewhurst03] $1 路 [GnuMake] 路 [Stroustrup00] $9.1
3. 浣跨敤涓涓増鏈帶鍒剁郴緇?/h2>
鎽樿
濂借鎬ф瘮涓嶄笂鐑傜瑪澶?浣跨敤涓涓増鏈帶鍒剁郴緇?VCS).鍐充笉瑕佽媯鍑虹殑鏂囦歡淇濈暀寰堥暱鏃墮棿.涓鏃︿綘鐨勬洿鏂扮殑鍗曞厓閫氳繃嫻嬭瘯灝卞敖蹇鍏?紜繚媯鍏ョ殑浠g爜涓嶄細鐮村潖鏁翠釜鏋勫緩.
璁ㄨ
鍑犱箮鎵鏈変笉騫沖嚒鐨勫伐紼嬮兘闇瑕佷竴涓互涓婄殑寮鍙戣呭拰/鎴栬秴榪囦竴鍛ㄧ殑宸ヤ綔閲?鍦ㄨ繖鏍風殑宸ョ▼涓?浣犲皢闇瑕佹瘮杈冨悓涓鏂囦歡鐨勫巻鍙茬増鏈互紜畾鍙樺寲鏄粈涔堟椂鍊?鍜?鎴栬璋?寮曞叆鐨?浣犱篃灝嗛渶瑕佹帶鍒跺拰綆$悊婧愪唬鐮佺殑鍙樺寲.
褰撴湁澶氫釜寮鍙戣呮椂,鍑犱釜寮鍙戣呭緢鍙兘浼氬湪鍚屼竴鏃墮棿瀵瑰悓涓鏂囦歡鐨勪笉鍚岄儴鍒嗚繘琛屽茍琛屽湴鏇存敼.浣犻渶瑕佸伐鍏蜂互鑷姩榪涜鏂囦歡鐨勬鍑哄拰鎭㈠,浠ュ強鍦ㄦ煇浜涙椂鍊欏騫跺彂緙栬緫鐨勫悎騫?VCS鑷姩鎿嶄綔鍜屾帶鍒舵鍑?鎭㈠浠ュ強鍚堝茍.VCS姣旀墜宸ュ仛鐨勬洿蹇洿鍑嗙‘.鑰屼笖浣犱笉鐢ㄨ姳鏃墮棿姣忓ぉ鐨勫幓鎽嗗紕閭d簺閲嶅鎬х殑宸ヤ綔,浣犳湁杞歡瑕佸啓.
涓嶈鐮村潖鏋勫緩.鍦╒CS涓殑浠g爜蹇呴』鎬繪槸鍙互鎴愬姛鏋勫緩鐨?
瀛樺湪寰堝鐨勭増鏈帶鍒剁郴緇熷彲渚涢夋嫨,娌℃湁鐞嗙敱涓嶅幓鐢ㄥ畠.鏈渚垮疁鍜屾祦琛岀殑鏄痗vs(瑙佸弬鑰?.瀹冩槸涓涓伒媧葷殑宸ュ叿,鍏瘋儭TCP/IP璁塊棶鐗規?鍙夋嫨鎬х殑鎻愰珮瀹夊叏鎬?閫氳繃鐢ㄥ畨鍏ㄥ澹砈SH浣滀負鍚庣),鍗撹秺鐨勮剼鏈鐞?鐢氳嚦鏈夊浘褰㈡帴鍙?璁稿鍏跺畠VCS涔熷皢cvs浣滀負鏍囧噯鍘繪晥浠?鎴栧熀浜庡畠鏋勫緩鏂扮殑鍔熻兘.
渚嬪
浠庡鑷崇粓鍙姳涓鍛ㄥ乏鍙蟲椂闂寸殑涓涓▼搴忓憳鐨勯」鐩垨璁稿彲浠ヤ笉闇瑕乂CS鑰岀敓瀛樺惂.
鍙傝?/h3>
[BetterSCM] 路 [Brooks95] $11, $13 路 [CVS]
4. 鍦ㄤ唬鐮佸闃呬笂浣滄姇鍏?/h2>
鎽樿
浠g爜瀹¢槄:鏇村鍙岀溂鐫涘皢浼氬甫鏉ユ洿濂界殑璐ㄩ噺.灞曠ず浣犵殑浠g爜,騫墮槄璇諱粬浜虹殑.浣犱滑閮藉皢鐩鎬簰瀛︿範鎴栧彈鐩?
璁ㄨ
涓涓壇濂界殑浠g爜瀹¢槄榪囩▼鍦ㄨ澶氭柟闈㈤兘瀵逛綘鐨勫洟闃熸湁濂藉.瀹冨彲浠?
鍗充嬌浣犵殑闆囦富榪樹笉鏀寔浠g爜瀹¢槄鏂規硶,浣犱篃瑕佸鍔犵鐞嗙煡璇?鎻愮ず:瑕佸紑濮?緇欎粬浠湅榪欐湰涔?浠ュ強鏃犺濡備綍瑕佸敖浣犳渶澶у姫鍔涘幓瀹夋帓鏃墮棿騫跺紩瀵煎闃呯殑榪涜.榪欐椂闂存槸鍊煎緱鑺辯殑.
灝嗕唬鐮佸闃呬綔涓轟綘鐨勮蔣浠跺紑鍙戝懆鏈熺殑涓欏瑰父瑙勭▼搴?濡傛灉浣犲拰浣犵殑闃熷弸璧炲悓鍩轟簬嬋鍔?涔熷彲鑳芥槸鎸姌)鐨勫鎯╁埗搴?灝變細濂藉緱澶?
涓嶈鍋氬緱澶艦寮忓寲浜?鍐欎竴灝佺畝鍗曠殑閭歡灝辮凍澶熷皢浠g爜瀹¢槄鍋氬緱寰堝ソ浜?榪欎細浣夸綘鏇村鏄撹窡韙嚜宸辯殑榪涚▼浠ュ強閬垮厤閲嶅.
褰撳闃呬粬浜虹殑浠g爜鏃?浣犲彲鑳芥兂鍦ㄦ梺杈逛繚鐣欎竴涓緵鍙傝冪殑娓呭崟.紿冧互涓轟竴涓ソ鐨勬竻鍗曞彲鑳芥鏄綘姝e湪璇葷殑榪欐湰涔︾殑鐩綍琛?婊℃剰鍚?
鎽樿:鎴戜滑鐭ラ亾鎴戜滑鍦ㄧ粰"鍞辮瘲鐝?甯冮亾,浣嗘槸涓嶅緱涓嶈.浣犱滑鐨勮嚜璐熸垨鑷垜涓諱箟涔熻璁ㄥ帉浠g爜瀹¢槄,浣嗕綘浠腑鐨勫皯閲忓ぉ鎵嶇▼搴忓憳鍠滄瀹?鍥犱負瀹冧細鏈夋垚鏁堝茍浣夸唬鐮佹洿濂?浣跨▼搴忔洿寮哄仴.
鍙傝?/h3>
[Constantine95] $10, $22, $33 路 [McConnell93] $24 路 [MozillaCRFAQ]
]]>
鎴戞兂澶у鐪嬬湅鎴戠殑浠g爜,緇欐垜涓鐐規剰瑙佸拰寤鴻.
]]>
鍦ㄦā鏉垮弬鏁頒腑,綾誨瀷鍙傛暟鍙互榪欐牱鏋勯?
聽聽聽聽聽聽聽 template_class< type( type1, type2, ... ) > a_class;
姣斿,鍙互void( void ), void(), void( int ), 涔熷彲浠nt( void ), string( int )絳夌瓑,緙栬瘧鍣ㄦ槸灝嗗畠浠綋浣滀笉鍚岀殑綾誨瀷鐨勬潵澶勭悊鐨?瀵規,鎴戝啓浜嗕竴浜涗唬鐮佷綔浜嗕竴涓嬫祴璇?瑙佹枃鏈?.浣嗘垜涔熶粎浠呮槸鏈変竴涓劅鎬х殑璁よ瘑鑰屽凡,瀵逛簬鍏朵負浠涔堝彲浠ヨ繖鏍?鍥犱負浠庢湭瑙佸摢鏈功涓婁粙緇嶈繃榪欐牱鐨勭敤娉?,鎴戜竴鐐逛篃涓嶇煡閬?
甯屾湜澶у甯垜閲婄枒,涔熷笇鏈沜punion鏉ュ府鎴戜竴涓?璋㈣阿!
#include聽<iostream>
typedef聽void(*fun)(int);
using聽namespace聽std;
template<聽typename聽T聽>
struct聽Base
{
聽聽聽聽void聽test()
聽聽聽聽
{
聽聽聽聽聽聽聽聽cout聽<<聽"Base
聽聽聽聽聽聽聽聽cout聽<<聽"Base<"聽<<聽typeid(T).name()聽<<聽">"聽<<聽endl;
聽聽聽聽}
};
template<>
struct聽Base聽<聽void聽>
{
聽聽聽聽void聽test()
聽聽聽聽
{
聽聽聽聽聽聽聽聽cout聽<<聽"Base
聽聽聽聽}
};
template<>
struct聽Base聽<聽void(聽int聽)聽>
{
聽聽聽聽void聽test()
聽聽聽聽
{
聽聽聽聽聽聽聽聽cout聽<<聽"Base
聽聽聽聽}
};
template<>
struct聽Base聽<聽fun聽>
{
聽聽聽聽void聽test()
聽聽聽聽
{
聽聽聽聽聽聽聽聽cout聽<<聽"Base
聽聽聽聽}
};
template<>
struct聽Base聽<聽int(聽string,聽int,聽char聽)聽>
{
聽聽聽聽void聽test()
聽聽聽聽
{
聽聽聽聽聽聽聽聽cout聽<<聽"Base
聽聽聽聽}
};
int聽main(int聽argc,聽char*聽argv[])
{
聽聽聽聽Base<聽void聽>聽b_void;
聽聽聽聽Base<聽void(聽int聽)聽>聽b_void_int;
聽聽聽聽b_void.test();
聽聽聽聽b_void_int.test();
聽聽聽聽Base<聽int(聽string,聽int,聽char聽)聽>聽b_int;
聽聽聽聽Base<聽fun聽>聽b_fun;
聽聽聽聽b_int.test();
聽聽聽聽b_fun.test();
聽聽聽聽Base<聽Base<聽void聽>聽(聽Base聽<聽int聽(聽string,聽int,聽char聽)聽>聽)聽>聽b_complex;
聽聽聽聽b_complex.test();
聽聽聽聽return聽0;
}
]]>
浠ヤ笅鏄叿浣撶殑鎻忚堪:
namespace聽code
{
enum聽CodeType聽
{聽UTF_8,聽UNICODE聽};
template<聽CodeType聽srcT,聽CodeType聽desT聽>
struct聽ConvertType
{};
template<>
struct聽ConvertType聽<聽UTF_8,聽UNICODE聽>
{
聽聽聽聽typedef聽char聽srcType;
聽聽聽聽typedef聽wchar_t聽desType;
};
template<聽CodeType聽srcT,聽CodeType聽desT聽>
struct聽Convert聽
{};
template<>
struct聽Convert<聽UTF_8,聽UNICODE聽>
{
聽聽聽聽//error聽C2899:聽涓嶈兘鍦ㄦā鏉垮0鏄庝箣澶栦嬌鐢ㄧ被鍨嬪悕縐?/SPAN>
聽聽聽聽typedef聽typename聽ConvertType<聽UTF_8,聽UNICODE聽>::srcType聽srcType;聽聽聽聽//!
聽聽聽聽typedef聽typename聽ConvertType<聽UTF_8,聽UNICODE聽>::desType聽desType;聽聽聽聽//!
};
}聽//namespace聽code
/**//*
榪欓噷鏍規湰涓嶉渶瑕乼ypename.
typename闄ょ敤鍦ㄦā鏉垮0鏄庝腑澶?鍙兘鐢ㄤ簬璇存槑妯℃澘綾葷殑鎴愬憳鏄竴涓被鍨?
渚嬪:
template
//聽Another聽way
template
聽聽聽聽typedef聽double聽DoubleType;
聽聽聽聽typename聽X
};
鑰屽鏋滀笉鏄ā鏉跨被,鍒欎笉鑳界敤typename.榪欐椂,瀹冨茍涓嶆槸澶氫綑鐨?鑰屾槸涓瀹氫笉鑳借鐨?
渚嬪:
template<>聽struct聽X<聽X
聽聽聽聽typename聽X
聽聽聽聽X
};
鎴戝墠闈㈢殑浠g爜涔熸槸榪欐牱鐨勬儏鍐?ConvertType<聽UTF_8,聽UNICODE聽>宸茬粡鏄竴涓叿浣撶殑綾諱簡,涓嶈鏄ā鏉跨被,鎵浠onvertType<聽UTF_8,聽UNICODE聽>::srcType鍓嶄笉鑳藉姞typename.
]]>
浣嗘兂浜嗗嚑澶╀簡,閮芥病鏈変竴涓悎閫傜殑鏂規鏉ュ疄鐜?
鍞?.....
浠婂ぉ鍏堣瘯鐫鍐欎簡鍐?鎵炬壘鎰熻,鎺ョ潃鍐嶆兂鍚?..