簡體   English   中英

mem_fn & bind 的一些實際用途

[英]some practical uses of mem_fn & bind

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

任何幫助將不勝感激。

我已經將std::mem_fnstd::bind用於反射樣式屬性。

所以我會有一個class SomeClass和一個AbstractProperty的向量。 AbstractProperty可以有幾種不同類型的類,例如PropertyFloatPropertyU32等。

然后在SomeClass我將bindAbstractPropertystd::function 我會通過做來bind

std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)

對於 setter 類型的函數,我會使用

 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

當然,這些類型可以使用模板並且更加通用,但這是一種權衡,取決於您的開發目的。

通常,將成員函數用於回調可能會很麻煩,例如在<algorithm>函數中使用。 std::mem_fn (現在已經標准化,因此您不再需要使用tr1命名空間)創建一個可調用對象,該對象可用作這些函數的函子對象。 有關其使用的示例,請參閱此鏈接的示例部分,部分使用std::string::size

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

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

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

以下代碼計算大於 5 的元素數:

#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 很難使用來自前向聲明類的方法。 我已經使用 bind 來利用使用前向聲明類中的方法的成員函數。 我找不到使用 lambda 的解決方案。 這是一個場景:我有一個成員函數列表,f1,f2,...在類 A 中定義,其中一些使用了來自前向聲明類的方法。 我希望能夠使用這些 fi 函數中的任何一個靈活地交換表達式樹(B 類)節點的運算符。 在 B 中,定義了泛型運算符。 我使用 bind 將 fi 函數自適應地關聯到泛型運算符。 這樣,fi 成員函數定義可以在放置前向聲明的 Ah 文件中原型化,然后 fi 函數的實現可以放在 A.cpp 文件中並由 B 類訪問。 我很好奇其他人是否遇到過這個問題以及他們是如何處理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM