您好,登錄后才能下訂單哦!
C++11中怎么實現參數綁定,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
lambda表達式的缺點
還記得當初引入lambda表達式的原因么?向算法傳遞謂詞時,由于一般的函數無法傳遞參數以外的信息,函數對象又比較麻煩,所以引入了lambda表達式。
但是lambda表達式也有缺點:在類似功能多次使用的時候,每次定義lambada表達式也會比較麻煩。本文介紹另一種方式:參數綁定。
標準庫bind函數
繼續用lambda表達式中用過的例子,如果希望找到第一個長度小于2的string,可以使用以下代碼:
bool istarget(const string& s){
return s.size() < 2;
}
vector<string> v{"This","is", "a", "predicate", "."};
auto found = find_if(v.begin(), v.end(), istarget);
cout << *found << endl;
如果我們希望在istarget中選擇string時使用變量而不是固定的2的時候,一般的函數就不能滿足需求了(雖然使用全局變量算是一個選項)。除了和函數對象和lambda表達式以外,還可以使用標準庫bind函數來實現,其步驟如下:
根據需求定義比較函數
在本例中,就是定義一個接受選擇對象string對象和最小長度參數的istarget函數:
bool istarget(const string& s, int sz){
return s.size() < sz;
}
使用參數綁定定義新的可調用對象
C++11標準庫提供了一個bind函數,按照C++ Primer的說法,可以將bind函數看作一個通用的函數適配器,它接受一個可調用對象,生成一個新的可調用對象來“適應”原對象的參數列表。調應bind的一般形式為:
auto newCallable = bind(callable, arg_list);
具體到本例,可以這樣定義:
auto isTarget = bind(istarget, _1, 2);
istarget:bind適配的對象,就是第一步中定義具有兩個參數的istarget函數
接下來是傳遞給istarget的參數。參數的順序和istarget參數列表中規定的一致。
_1:占位符,_1代表isTarget被調用時的接受的第一個實參,這個_1處在bind參數列表的第一個位置表明isTarget的第一個實參會在調用istarget時作為istarget的第一個實參使用。
2:比較長度信息,形式和占位符不同,處在參數列表的第二個位置,這個值會在調用istarget時作為istarget的第二個實參使用。
使用定義的可調用對象
vector<string> v{"This","is", "a", "predicate", "."};
auto found = find_if(v.begin(), v.end(), isTarget);
cout << *found << endl;
由于在bind定義時只使用了一個占位符,所以可以把isTarget當作一個只有一個參數的可調用對象使用,這個參數的類型和istarget的第一個參數一致。
istarget函數定義一次之后,可以使用bind函數適應各種算法的要求,從而實現了實現一次定義,多次使用的目標。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。