回答
通常,使用成員函數進行回調可能相當麻煩,例如在<algorithm>
函數中使用。 std::mem_fn
(它現在已經標準化,因此不需要再使用tr1
命名空間)創建一個可調用的對象,該對象可用作這些函數的函子對象。有關其使用的示例,請參閱使用std::string::size
的this link的示例部分。
std::bind
可以在例如,你不知道編譯時的實際參數,但必須創建一個帶有參數運行時的可調用對象。它也可以用來重新排序參數,例如:
auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");
(好吧,愚蠢的例子,但現在已經好了,我能想到的。)
我已經使用std::mem_fn
和std::bind
反思樣式屬性。
所以我會有一個class SomeClass
矢量AbstractProperty
。可以有幾種不同類型的類從AbstractProperty
,如PropertyFloat
,PropertyU32
等
然後在SomeClass
我將bind
到std::function
爲AbstractProperty
。我會bind
做
std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)
對於二傳手類型的功能,我會用
std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)
當然,要設置功能的類是比較困難的,但我用std::function
做所以。在PropertyFloat
我
typedef std::function<float(void)> GetterType;
因此,通過功能設置,我會通過第一std::bind
我發現作爲參數
typename PropertyFloat::GetterType getter
當然,類型可以利用模板和可更通用,但這是一種權衡取決於你正在開發的東西。
下面的代碼計數元件大於五的數目:
#include <functional>
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
using namespace std;
vector<int> v { 1, 5, 2, 7, 6, 7, 5 };
cout << count_if(v.begin(), v.end(),
bind(greater<int>(), placeholders::_1, 5)) << endl;
}
爲什麼在這個例子中綁定是比lambda函數更好的選擇? – 2016-01-07 13:34:29
- 1. jQuery.get() - 實際用途?
- 2. Lua在Mac OS X中的一些實際用途是什麼?
- 3. TypedReference的實際用途
- 4. 遞歸的實際用途
- 5. 線程的實際用途
- 6. lua中的表格不足 - 有哪些實際用途?
- 7. 對象序列化的實際用途?
- 8. toContain()的實際用途是什麼?
- 9. Seralization隔離級別的實際用途?
- 10. 什麼是System.Transactions的實際用途?
- 11. Socket.ExclusiveAddressUse的實際用途是什麼?
- 12. Android NDK的實際用途是什麼?
- 13. array_diff_uassoc的實際用途是什麼?
- 14. jQuery的實際用途是什麼?
- 15. 臨時文件的實際用途
- 16. 「volatile restrict」指針有實際用途嗎?
- 17. 的mem_fn到的mem_fn構件
- 18. C++ 11:如何使用std :: mem_fn和繼承std :: bind
- 19. 如果我們有boost :: bind,使用boost :: mem_fn有什麼意義?
- 20. 你對jQuery的data()方法應用了哪些更實際的用途?
- 21. 這是一種服務的實際用途嗎?
- 22. 創建一個通用的包裝,返回std :: mem_fn或boost :: mem_fn
- 23. 一元+運算符有任何實際用途嗎?
- 24. JUnit測試用例中「失敗」的實際用途是什麼?
- 25. 什麼是PHP的睡眠()的實際用途?
- 26. ES5提供的新方法的實際用途是什麼?
- 27. NSSearchPathDirectory的一些用途枚舉
- 28. 任何人都可以想到XMLGregorianCalendar.getEon()的實際用途嗎?
- 29. Observable.never()函數的實際用途是什麼?
- 30. <sparkle:ReleaseNotesLink>的實際用途是什麼?
1。這也是我想嘗試的一種。你有更多的細節來分享你如何做反射位? – Fanatic23 2012-04-14 21:02:07
嗯,這基本上是我可以描述的最多,沒有可能將整個代碼庫放在github上或什麼東西(代碼是封閉的源代碼)。我更新了我的帖子,以提供更多細節。不幸的是,我在這裏開發的系統類型沒有很多文檔。我正在編寫整個系統的大文檔,但尚未完成。我可以說我已經使用了'std :: mem_fn'和'std :: bind'這種東西近兩年了,但沒有任何問題。 – josephthomas 2012-04-14 21:07:40
也不是,這是我知道的'mem_fn'和'bind'最複雜的用法之一。如果你正在尋找使用這兩種類型的練習,也許你應該看看它們的一些小用法(我在開發這個系統之前首先做了)。這個反射系統是圍繞這兩種類型(和'std :: function')的使用而構建的。雖然老實說,這可能只能用成員函數指針來替換(理論上)。他們都有其優點和缺點。 – josephthomas 2012-04-14 21:16:17