[語法] bind( map<int,int>::value_type::first, _1 )

看板C_and_CPP作者 (眠月)時間15年前 (2009/07/23 23:07), 編輯推噓1(1026)
留言27則, 4人參與, 最新討論串1/1
請問這個語法是什麼鬼 /_\ 出自這邊... http://stackoverflow.com/questions/110157/how-to-retrieve-all-keys-or-values-from-a-stdmap/110228#110228 雖然我知道 bind 也知道 map 也知道 map::value_type 也知道 boost::lambda::_1 但是 bind( &std::map<int,int>::value_type::first, _1 ) 我實在困惑了.. bind 怎麼有辦法用 &std::map<int,int>::value_type::first 這種語法 去取得 pair 的 first 成員... 有沒有大師可以開示一下.. <(_ _)> -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.105.20

07/23 23:16, , 1F
07/23 23:16, 1F

07/23 23:57, , 2F
_1 是指定 object 吧。
07/23 23:57, 2F

07/23 23:59, , 3F
上面回太短,bind 第一引數是成員指標時,第二引數是 obj
07/23 23:59, 3F

07/24 00:02, , 4F
所以那個語法有什麼問題嗎?
07/24 00:02, 4F

07/24 00:05, , 5F
還是說你搞混 map::mapped_type 和 map::value_type。
07/24 00:05, 5F

07/24 00:06, , 6F
map<int,int>::value_type 是 pair<const int, int>
07/24 00:06, 6F

07/24 00:07, , 7F
pair<const int, int>::first 就是一個 const int 實體。
07/24 00:07, 7F

07/24 00:08, , 8F
bind() 的求值語意當 _1 是 value 或 ref 時就是 _1.first
07/24 00:08, 8F

07/24 00:09, , 9F
,_1 是 pointer 的時候就是 _1->first。
07/24 00:09, 9F

07/24 00:10, , 10F
我搞不懂的是bind裡面是怎麼從一個成員指標拿到那個值 @@
07/24 00:10, 10F

07/24 00:16, , 11F
有個 boost::mem_fn 不是可以把資料成員指標轉成函式?
07/24 00:16, 11F

07/24 00:18, , 12F
bind(成員指標, 物件/物件參考/物件指標)
07/24 00:18, 12F

07/24 00:18, , 13F
unspecified-6-1 bind(R T::*f, A1 a1) 此建構式會呼叫它
07/24 00:18, 13F

07/24 00:19, , 14F
第二個參數要給才拿得到值,沒給一定死。
07/24 00:19, 14F

07/24 00:21, , 15F
上面的求值語意也可以想成 _1.*(成員指標) 和
07/24 00:21, 15F

07/24 00:22, , 16F
_1->*(成員指標),實作上是用 .* 和 ->* 把兩個參數結合。
07/24 00:22, 16F

07/24 00:27, , 17F
那個 bind() 也不過就是說成員指標綁定的物件延後給而已。
07/24 00:27, 17F

07/24 00:36, , 18F
外面的 transform() 會負責把 map 裡的 pair 一個一個塞給
07/24 00:36, 18F

07/24 00:36, , 19F
_1 用,效果大概就是這樣,推累了先來睡 XD
07/24 00:36, 19F

07/24 03:25, , 20F
O_O 原來如此.. 一直以為 bind 只能用在 function 上面
07/24 03:25, 20F

07/24 03:26, , 21F
哇北七了... 感謝大大詳細解說 :D
07/24 03:26, 21F

07/24 03:26, , 22F
這樣想一想設計 bind 的人還真是厲害 @@..
07/24 03:26, 22F

07/24 03:26, , 23F
因為我之前也一直在想類似的問題. 但是就想不出來要怎麼作
07/24 03:26, 23F

07/24 03:27, , 24F
看到有人給這個解答.. 但是看不太懂所以才上來問 @@
07/24 03:27, 24F

07/24 10:15, , 25F
其實以 OO 為主的程式搭 boost 用常會遇到類似的問題。
07/24 10:15, 25F

07/24 10:16, , 26F
因為很多東西都在 class 裡面,要抓比較麻煩。
07/24 10:16, 26F

07/24 21:57, , 27F
偉哉 lambda ^O^
07/24 21:57, 27F
文章代碼(AID): #1AQ7oLmT (C_and_CPP)