锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 榪欐槸涓婃鏈鍚庣殑浠g爜錛屼負浜嗘柟渚挎弿榪幫紝鍐嶈創涓浠姐?br> 褰撶劧 vector<int> 涔熸湁int錛屼絾榪欎釜涓嶇畻 錛氾級 鎬葷殑鏉ヨ錛宨nt鍜?涓涓彉閲?int op::_i錛?涓変釜鍑芥暟 op::op(int i), op::operaator(int& i) 鍜?place_holder::operator=(int) 鏈夊叧緋伙紝榪欎竴鐐瑰緢閲嶈錛岀被鍜屽嚱鏁板湪娉涘瀷涓殑浣滅敤涓嶄竴鏍鳳紝 鍐嶇粏鍒嗕竴鐐癸紝鍜?_1 鏈夊叧鐨刬nt灝卞彧鏈塷p::operator()涓涓紝鍏朵粬閮藉拰 _1 娌″叧緋匯?br>鍓╀笅鐨勯兘鍜?3 鏈夊叧緋伙紝鎯蟲兂 3 鐨勪紶閫掕礬寰勶紝 浠?place_holder::operator = 鍒?op::op(int i)錛?鍐嶅埌 op::_i銆?/p>
涔熷氨鏄op::operator()瑕佷竴涓嫭绔嬬殑妯℃澘鍙傛暟銆?br>鎯蟲兂鐪嬶紝鍏跺疄op::op(int i) 鍜?op::_i 鏄竴涓笢瑗匡紝鏋勯犲嚱鏁板氨鏄負浜嗗垵濮嬪寲榪欎釜鍙橀噺銆傛墍浠ヨ繖閲岄夋嫨娉涘寲鏁翠釜op錛屽氨鏄鏋勯犲嚱鏁扮殑鍙傛暟鍜屽彉閲忔槸鍚屼竴涓被鍨嬨?br>瀵逛簬place_holder::operator =錛?鏄娉涘寲鏁翠釜place_holder鍛紝榪樻槸鍙硾鍖杙lace_holder::operator=鍛紝褰撶劧娉涘寲鍑芥暟錛屽洜涓虹被涓嶄細榪涜綾誨瀷鎺ㄥ銆?br>鎰忔濇槸濡傛灉娉涘寲綾葷殑璇濓紝浣犲氨瑕佹湁涓烘棤鏁扮被鍨嬬壒鍖栬繃鐨刾lace_holder錛岃繖閲屽緢闅劇悊瑙o紝涓嶇悊瑙g殑璇濓紝緇х畫鐪嬩笅鍘誨惂銆?/p>
鐜板湪灝卞紑濮嬪疄鍋氬惂銆?br> 浜庢槸錛屽湪for_each閲岄潰錛岀浉褰撲簬鏈夎繖涔堜竴鍙ワ細 濂戒簡錛屽埌鐜板湪錛屼竴涓祴鍊肩殑lambda灝卞仛濂戒簡錛屽畠榪樿兘榪欎箞鐢細 灝辯粰x璧嬪?浜嗭紝紲炲鍚с?br>鍥犱負 (_1 = 5)榪斿洖鐨勬槸涓猯ambda琛ㄨ揪寮忥紝涔熷氨鏄釜浠垮嚱鏁幫紝:) 鐜板湪鎵嶇湅鍒發ambda鏍稿績鐨勪竴灝忛儴鍒嗭紝宸茬粡璁╀漢鎰熻鐪╂檿浜嗐?br>鐪嬬湅鐜板湪榪樺瓨鍦ㄧ殑闂錛屽彧瀹炵幇浜嗕竴涓祴鍊兼搷浣滐紝鍏朵粬鐨勫憿錛?涓嬬瘒緇х畫銆傘傘?/p>
榪欐鏉ョ湅鐪嬫庝箞娣誨姞鏂扮殑榪愮畻榪涘幓錛岀劧鍚庡啀璇寸偣鍏充簬琛ㄨ揪寮忕殑闂錛屼負浠ュ悗鐨勬墿灞曟墦涓嬬悊璁哄熀紜銆?br>
鍏堢湅鐪嬩箣鍓嶇殑浠g爜鍚э紝
2 struct op
3 {
4 op(_U i)
5 : _i(i)
6 {}
7
8 _U _i;
9
10 template<typename _T>
11 _T& operator()(_T& i)
12 {
13 i = _i;
14 }
15 };
16
17 struct place_holder
18 {
19 template <typename _T>
20 op<_T> operator=(_T i)
21 {
22 return op<_T>(i)
23 }
24 };
25
26 place_holder _1;
27
28 vector<double> v;
29 for_each(v.begin(), v.end(), _1 = 3);
鐜板湪錛岃鍦ㄨ繖涓熀紜涓婏紝娣誨姞鏂扮殑鎿嶄綔榪涙潵錛屾瘮濡傝operator+=鍚с傝鎬庝箞鍋氬憿錛?br>
1. place_holder瑕侀噸杞給perator+= 鎵嶅彲浠ワ紝鍥犱負place_holder鐨勪富瑕佷換鍔″氨鏄浛鎴戜滑鐢熸垚涓涓豢鍑芥暟銆?br>2. 瑕佹湁鐩稿簲鐨勪豢鍑芥暟鏉ョ湡姝g殑鍋?+= 錛屼篃灝辨槸璇村湪浠垮嚱鏁扮殑operator()閲岄潰錛岃鏈夌湡姝e共媧葷殑鎿嶄綔銆?br>
濂戒簡錛屽紑濮嬪惂錛?鍏堢湅鐪嬪疄鐜幫紝鐒跺悗鍦ㄨВ閲娿?br>
2 {
3 op(int i)
4 : _i(i)
5 {}
6
7 int _i;
8
9 int operator()(int& i)
10 {
11 return i = _i;
12 }
13 };
14
15 struct op1
16 {
17 op1(int i)
18 : _i(i)
19 {}
20
21 int _i;
22
23 int operator()(int& i)
24 {
25 return i += _i;
26 }
27 };
28
29 struct place_holder
30 {
31 op operator=(int i)
32 {
33 return op(i);
34 }
35
36 op1 operator+=(int i)
37 {
38 return op1(i);
39 }
40 };
41
42 place_holder _1;
43
44 void main()
45 {
46
47 vector<int> v;
48 v.push_back(12);
49 v.push_back(1342);
50 v.push_back(23);
51
52 for_each(v.begin(), v.end(), _1 += 3);
53 }
濂戒簡錛岀幇鍦?=鎿嶄綔宸茬粡琚敮鎸佷簡銆傚涔堢畝鍗曞憖銆傛潵鐪嬬湅閮藉仛浜嗕簺浠涔堬細
1. 緇檖lace_holder澧炲姞浜嗕竴涓猳perator+=鍑芥暟錛?operator+= 榪斿洖op1綾誨瀷鐨勪豢鍑芥暟銆?br>2. 澧炲姞浜嗕竴涓猳p1鐨勪豢鍑芥暟錛堢被妯℃澘錛夛紝鐢ㄦ潵鐪熸鐨勬墽琛?+= 鐨勮繍綆椼?br>
褰撶紪璇戝櫒鐪嬪埌 _1 += 3 鏃訛紝鍘繪壘鍒?place_holder::operator+=, 鐒跺悗鎶婃ā鏉垮弬鏁版帹瀵兼垚 int錛岃繑鍥炰竴涓?op1<int> 瀵硅薄銆?br>鍦╢or_each閲岄潰錛屽氨璋冪敤op1<int>::operator+=浜嗐?br>
褰撶劧涔熷彲浠ヨ繖涔堢敤錛?br>
2 (_1 += 10.4)(x);
鍒拌繖閲屽ぇ瀹舵兂蹇呭凡緇忓彲浠ョ収鐚敾铏庯紝瀹炵幇鍏朵粬鎿嶄綔浜嗗惂銆備絾鏄綋瀹炵幇鐨勬搷浣滃璧鋒潵鐨勬椂鍊欙紝鏂扮殑闂灝辨潵浜嗭紝姣斿鎯寵涓?_1 = _2 + 3.0 鐨勬椂鍊欏憿錛熺湅鐪嬩笅闈㈢殑浠g爜錛?br>
2
3 void fun(double& lhs, const double& rhs) //鐩稿悓鍔熻兘鍑芥暟
4 {
5 lhs = rhs + 3.0;
6 }
7
8 struct op
9 {
10 template <typename _T>
11 _T operator(_T& lhs, const _T& rhs)
12 {
13 lhs = rhs + 3.0;
14 }
15 };
16
鐪嬬湅lambda琛ㄨ揪寮忎負鎴戜滑鐪佷簡澶氬皯浠g爜錛佸綋鐒舵垜涓嶆槸涓轟簡璇磋繖涓屽啓榪欎箞闀挎浠g爜錛屾垜鎯寵錛岄偅涓猳p鏄垜浠殑鏈緇堢洰鏍囷紝鑳藉疄鐜板悧錛熶笉鑳斤紒鍥犱負鍦╫p閲岄潰鐩存帴鍑虹幇浜?.0錛屾寜鐓у墠闈㈢殑鎯緥錛屽簲璇ュ湪op閲岄潰鏈変竴涓垚鍛樺彉閲忔潵淇濆瓨3.0錛屼笉鏄悧錛熸牴鏈棶棰樹笉鍦ㄨ繖閲屻?br>
浠旂粏鎯蟲兂鎴戜滑鍒板簳鍦ㄥ仛浠涔堬紝鎴戜滑鍦ㄧ敤template鐨勬妧娉曪紝“緙栬瘧”琛ㄨ揪寮忋?br>place_holder鍏跺疄灝卞儚C++鐨勮〃杈懼紡錛宱p灝卞儚姹囩紪璇█錛岄氳繃template鎶娉曪紝鎶妏lace_holder鐨勮〃杈懼紡“緙栬瘧”鎴愮敤op緇勬垚鐨勬搷浣滐紝op鏄彲浠ョ洿鎺ヨC++榪愯鐨勪豢鍑芥暟銆備篃灝辨槸璇存槸涓涓粠lambda璇硶鍒癈++璇硶鐨勭紪璇戝櫒錛屼絾鏄繖涓紪璇戝櫒闈爐emplate鎶娉曞疄鐜幫紝鐢辯湡姝g殑C++緙栬瘧鍣ㄨ繘琛屾ā鏉挎帹瀵鹼紝鏈鍚?#8220;緙栬瘧”鎴怌++鐨勪豢鍑芥暟銆傛墍浠ヤ竴鍙ヨ瘽灝辨槸錛?br>
鐢╰emplate鎶娉曞疄鐜扮殑浠巐ambda璇硶鍒癈++璇硶鐨?#8220;緙栬瘧鍣?#8221;銆?br>
鎵浠ユ牴鏈棶棰樺湪浜巓p鐨勮繖縐嶅啓娉曟病鏈夊姙娉曟墿灞曪紝闅鵑亾瀵逛簬姣忕榪炶搗鏉ョ殑鎿嶄綔錛岄兘鍒嗗埆鍐欎竴涓猳p鍚楋紙姣斿_1 = (_2 + 3.0) * (_2 - 3.0)錛孋++涓〃杈懼紡鏃犳暟錛岃鏄瘡縐嶉兘瑕佸啓涓猳p錛岄偅瑕乴ambda浣曠敤 錛夛紵op鐩稿綋浜庢眹緙栵紝鍙鍑犱釜綆鍗曠殑榪愮畻灝監K錛屽叧閿湪浜庢寜鐓lace_holder鐨勮〃杈撅紝鎶妎p緇勫悎璧鋒潵銆?br>
涓嬩竴綃囧噯澶囦粙緇嶄竴涓媌oost::tuple錛屽拰琛ㄨ揪寮忕紪璇戯紝鍥犱負瀹冧滑鏄疄鐜發ambda鐨勫叧閿鍣ㄣ?
]]>
2 {
3 op(int i)
4 : _i(i)
5 {}
6
7 int _i;
8
9 int operator()(int& i)
10 {
11 i = _i;
12 }
13 };
14
15 struct place_holder
16 {
17 op operator=(int i)
18 {
19 return op(i)
20 }
21 };
22
23 place_holder _1;
24
25 for_each(v.begin(), v.end(), _1 = 3);
瑕佸幓鎺夊int鐨勪緷璧栵紝鍏堜粩緇嗘兂鎯沖int鐨勪緷璧栭兘鍦ㄥ摢閲岋紵璇存槑鐧界偣灝辨槸鏁翠釜紼嬪簭錛屽摢閲岄兘鏈塱nt錛?br>1. op鐨勬瀯閫犲嚱鏁板弬鏁版槸int
2. op閲岄潰鐨勬垚鍛樺彉閲?_i鐨勭被鍨嬫槸int
3. op鐨刼perator() 鐨勮繑鍥炲煎拰鍙傛暟閮芥湁int
4. place_holder鐨刼perator=鐨勫弬鏁版槸int
鐪嬬湅 http://m.shnenglu.com/yindf/archive/2009/02/20/74397.html 涓鐨勭被妯℃澘鍜屽嚱鏁版ā鏉跨殑鍖哄埆鍚с?/p>
2 struct op
3 {
4 op(_U i)
5 : _i(i)
6 {}
7
8 _U _i;
9
10 template<typename _T>
11 _T& operator()(_T& i)
12 {
13 i = _i;
14 }
15 };
16
17 struct place_holder
18 {
19 template <typename _T>
20 op<_T> operator=(_T i)
21 {
22 return op<_T>(i)
23 }
24 };
25
26 place_holder _1;
27
28 for_each(v.begin(), v.end(), _1 = 3);
濂戒簡錛屾硾鍖栧畬鎴愩傞毦閬撳氨榪欎箞綆鍗曪紵浜嬪疄灝辨槸榪欎箞綆鍗曘?br>鏉ュ垎鏋愪竴涓嬫ā鏉挎帹瀵肩殑榪囩▼鍚э紝 _1 = 3 璋冪敤錛屼粠涓嬮潰榪欎釜鍑芥暟寮濮嬶紝
2 op<_T> place_holder::operator=(_T i);
閭d箞榪欎釜_T 琚帹瀵間負 int, 鐒跺悗榪斿洖涓涓?op<int>, 鐒跺悗 op<int> 閲岄潰灝辨湁涓涓?int op<int>::_i;
2 p(*iter);
op鐨勬ā鏉垮弬鏁拌鎺ㄥ畾涔変負int浜嗭紙涓嶆槸鎺ㄥ鐨勶紝綾繪ā鏉夸笉浼氭帹瀵鹼級銆?br>
鎵浠ユ墜娉曟槸鍏堥潬鍑芥暟鎺ㄥ妯℃澘鍙傛暟錛屽啀闈犵被淇濆瓨綾誨瀷淇℃伅銆?br>
浜庢槸錛屼笅闈㈢殑鍑芥暟妯℃澘
2 _T& op<int>::operator()(_T& i)
3 {
4 i = _i;
5 }
鐨勬ā鏉垮弬鏁?_T 灝辮鎺ㄥ鎴?*iter 鐨勭被鍨嬩簡錛屼篃灝辨槸瀹瑰櫒鐨?value_type 浜嗐?/p>
2 (_1 = 5)(x);
鍒氭敞鍐屽ソcppblog鐨勭敤鎴鳳紝榪欑畻鏄濂充綔浜嗐?鏈榪戝湪瀛︿範boost::lambda, 鍒嗕韓涓嬪涔犲績寰楋紝鍏卞悓榪涙銆?br>
褰撶劧榪欑瘒涓嶆槸璁瞓oost::lambda鐨勭敤娉曠殑錛屽鏈夋湁浜烘劅鍏磋叮錛屽彲浠ュ弬鐓э細http://www.boost.org/doc/libs/1_38_0/doc/html/lambda.html
boost::lambda寰堝鏉傦紝涓涓ゅ彞璇濅篃璇翠笉娓呮錛屾垜灝藉姏鎻忚堪鐨勭畝鍗曚竴鐐癸紝鎱㈡參澧炲姞闅懼害銆?br>
瀵規垜鏉ヨ錛宐oost::lambda鐪佷簡涓嶅皯浜嬶紝鎴戞槸鍠滄stl algorithm鐨勶紝鐜板湪鍩烘湰涓婇櫎闈炵壒孌婃儏鍐碉紝紼嬪簭閲岄潰閮戒笉鍑虹幇寰幆浜嗐傜敤for_each, transform 絳夌瓑閮藉彲浠ユ悶瀹氾紝鍚﹀垯錛屽氨瑕佽冭檻鏁版嵁緇撴瀯鍜岀畻娉曟槸涓嶆槸鏈夐棶棰樹簡銆?br>
浣嗘槸闂鍦ㄤ簬姣忔鐢╢or_each鐨勬椂鍊欙紝閮借瀹氫箟涓涓豢鍑芥暟錛圡odern C++ Design 榪欎箞鍙殑錛夛紝楹葷儲錛岀▼搴忕湅璧鋒潵涔熶笉鎬庝箞浼橀泤欏虹晠錛屾昏鍋滀笅鏉ュ幓鐪嬮偅涓豢鍑芥暟鍒板簳騫蹭粈涔堜簡錛屽啓鐨勬椂鍊欒繕瑕佹兂鏄笉鏄娉涘寲錛屽緢澶寸棝銆傛湁浜哹oost::lambda錛屽氨鐖藉浜嗐傜湅璧鋒潵涓鐩簡鐒訛紝鍐欒搗鏉ョ畝鍗曟槑浜嗭紝涓嶇敤鍏沖績綾誨瀷銆傦紙鏄笉鏄悶鎺ㄩ攢鐨勶紵錛?br>
璦褰掓浼犲惂銆?br>
姣斿涓嬮潰榪欐浠g爜錛?br>
2 v.push_back(12);
3 v.push_back(1342);
4 v.push_back(23);
5
6 struct OP
7 {
8 void operator()(int &i)
9 {
10 i = 3;
11 }
12 };
13
14 for_each(v.begin(), v.end(), OP());
澶熺畝鍗曞惂錛屾妸鏁翠釜瀹瑰櫒鐨勫奸兘鏀規垚3. 鐪嬪埌閭d釜OP浜嗗惂錛屽緢綆鍗曠殑涓浠朵簨鎯咃紝闈炶璁╀漢鍐欒繖涔堜釜struct錛岃鏄啓鎴恈lass錛岃繕瑕乸ublic錛屾洿閮侀椃銆?br>
鐪嬬湅鐢ㄤ簡boost::lambda浠ュ悗鐨勬晥鏋滃惂銆?br>
2 v.push_back(12);
3 v.push_back(1342);
4 v.push_back(23);
5
6 for_each(v.begin(), v.end(), _1 = 3);
7
姣斾笉鐢╨ambda鏁存暣灝戜簡涓涓狾P瀹氫箟鍛錛屽洜涓?string("OP()").length() == string("_1=3").length() .
閭d箞錛屾庝箞鎵嶈兘杈懼埌榪欎釜鏁堟灉鍛紝鍦ㄨ繖閲岋紝鍏堝亣璁炬垜浠彧鐢╥nt綾誨瀷錛屽叧浜庢硾鍖栵紝涓嬩竴綃囧啀璇達紝涓嬈″悆澶氫簡娑堝寲涓嶈壇鐨勩?br>
鐔熸倝for_each鐨勯兘鐭ラ亾錛宖or_each鐨勭3涓弬鏁版槸涓嚱鏁板璞★紙鎴戜笉鐢ㄦ寚閽堟姳姝夛級錛屾敞鎰忓尯鍒嗕豢鍑芥暟鍜屽嚱鏁板璞★紝浠垮嚱鏁版槸涓被鍨嬶紝鍑芥暟瀵硅薄鏄釜瀵硅薄銆?br>
閭d箞涔熷氨鏄 _1 = 3 鐨勭粨鏋滃簲璇ユ槸涓嚱鏁板璞★紝鑰屼笖鏄釜涓鍏冨嚱鏁板璞★紙涓嶄簡瑙g殑鍘葷湅for_each瀹炵幇錛夈傜煡閬撲簡榪欎釜錛屽緢瀹規槗鍐欎釜澶ф錛?br>
2 {
3 ??? operator()(int& i)
4 {
5 i = ???;
6 }
7 };
8
9 struct place_holder
10 {
11 op operator=(int i)
12 {
13 return op???;
14 }
15 };
16
17 place_holder _1;
18
19 for_each(v.begin(), v.end(), _1 = 3);
錛燂紵錛熶笉鏄貢鐮侊紝榪欓噷鍙槸鏆傛椂涓嶇煡閬撳啓浠涔堛?br>鎴戣榪囷紝榪欑瘒閲岄潰綾誨瀷閮芥槸int錛屼絾鏄偅涓?鎬庝箞澶勭悊鍛紝鏄庢樉瑕佷繚瀛樼殑浠垮嚱鏁伴噷闈㈠幓涔堬紝鎵浠ヤ笂闈㈢殑浠g爜榪涗竴姝ヤ慨鏀癸紝
涓狾P閲岄潰澧炲姞鍙橀噺錛屾潵淇濆瓨3錛屽嚱鏁拌繑鍥炲肩幇鍦ㄤ笉閲嶈錛屽氨鍐欐垚int鍚э紝浠ュ悗鏈夐棶棰樺啀璇淬?br>浜庢槸浠g爜鍙樻垚錛?br>
2 {
3 op(int i)
4 : _i(i)
5 {}
6
7 int _i;
8
9 int operator()(int& i)
10 {
11 i = _i;
12 }
13 };
14
15 struct place_holder
16 {
17 op operator=(int i)
18 {
19 return op(i)
20 }
21 };
22
23 place_holder _1;
24
25 for_each(v.begin(), v.end(), _1 = 3);
闂瑙e喅銆?br>
鐪嬪埌榪欓噷錛屾暣涓▼搴忓凡緇忓彲浠ユ墽琛屼簡銆傛妸瀹瑰櫒鐨勫兼敼鎴?錛屾病闂鍚с?br>
鏁寸墖鏂囩珷閮藉湪涓涓亣璁句箣涓嬶紝灝辨槸鍙敤int錛岄偅瑕佹槸涓嶇敤int鍛紝鎯呭喌灝卞鏉備竴鐐逛簡錛屼笅綃囧啀璁ㄨ銆?濡傛灉鐔熸倝template鐨勮瘽錛屼笅綃囧緢瀹規槗錛屽惁鍒欙紝澶嶄範鍜?
]]>