2012-04-14 45 views
6

有人可以推薦一些很酷的實用tr1的mem_fn和綁定工具嗎?我不需要深奧的C++來進行庫開發。只是一些使用這些應用程序級別的編碼。mem_fn&bind的一些實際用途

任何幫助將不勝感激。

回答

5

通常,使用成員函數進行回調可能相當麻煩,例如在<algorithm>函數中使用。 std::mem_fn(它現在已經標準化,因此不需要再使用tr1命名空間)創建一個可調用的對象,該對象可用作這些函數的函子對象。有關其使用的示例,請參閱使用std::string::sizethis link的示例部分。

std::bind可以在例如,你不知道編譯時的實際參數,但必須創建一個帶有參數運行時的可調用對象。它也可以用來重新排序參數,例如:

auto f1 = std::bind(printf, _2, _1); 
f1(42, "%d\n"); 

(好吧,愚蠢的例子,但現在已經好了,我能想到的。)

5

我已經使用std::mem_fnstd::bind反思樣式屬性。

所以我會有一個class SomeClass矢量AbstractProperty。可以有幾種不同類型的類從AbstractProperty,如PropertyFloatPropertyU32

然後在SomeClass我將bindstd::functionAbstractProperty。我會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 

當然,類型可以利用模板和可更通用,但這是一種權衡取決於你正在開發的東西。

+0

1。這也是我想嘗試的一種。你有更多的細節來分享你如何做反射位? – Fanatic23 2012-04-14 21:02:07

+0

嗯,這基本上是我可以描述的最多,沒有可能將整個代碼庫放在github上或什麼東西(代碼是封閉的源代碼)。我更新了我的帖子,以提供更多細節。不幸的是,我在這裏開發的系統類型沒有很多文檔。我正在編寫整個系統的大文檔,但尚未完成。我可以說我已經使用了'std :: mem_fn'和'std :: bind'這種東西近兩年了,但沒有任何問題。 – josephthomas 2012-04-14 21:07:40

+0

也不是,這是我知道的'mem_fn'和'bind'最複雜的用法之一。如果你正在尋找使用這兩種類型的練習,也許你應該看看它們的一些小用法(我在開發這個系統之前首先做了)。這個反射系統是圍繞這兩種類型(和'std :: function')的使用而構建的。雖然老實說,這可能只能用成員函數指針來替換(理論上)。他們都有其優點和缺點。 – josephthomas 2012-04-14 21:16:17

3

下面的代碼計數元件大於五的數目:

#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; 
} 
+0

爲什麼在這個例子中綁定是比lambda函數更好的選擇? – 2016-01-07 13:34:29

相關問題