C++11新特性——std::bind参数绑定
系列文章目錄
C++11新特性大全+實例
文章目錄
- 系列文章目錄
- 前言
- 一、std::bind概述
- 1.std::bind簡介
- 2.std::bind原型
- 二、使用std::bind綁定
- 1.綁定第一類
- 2.綁定第二類
- 3.綁定第三類
- 三、占位符
- 總結
前言
C++ 這門編程語言的歷史可以追溯至 1979 年,當時的 Bjarne Stroustrup(C++ 之父,后續簡稱 Stroustrup)還在使用 Simula 語言進行開發工作。
1998 年,C++ 標準委員會發布了第一版 C++ 標準,并將其命名為 C++ 98 標準。據不知名人士透露,《帶注釋的C++參考手冊》這本書對 C++ 98 標準的制定產生了很大的影響。
經過作者的不斷迭代,一本書往往會先后發布很多個版本,其中每個新版本都是對前一個版本的修正和更新。C++ 編程語言的發展也是如此。截止到目前(2020 年),C++ 的發展歷經了以下 3 個個標準:
2011 年,新的 C++ 11 標準誕生,用于取代 C++ 98 標準。
2014 年,C++ 14 標準發布,該標準庫對 C++ 11 標準庫做了更優的修改和更新;
2017 年底,C++ 17 標準正式頒布;
雖然學習 C++11 需要花些時間,但這是非常值得的;C++11 非常實用,它不但提高了開發效率,還讓程序更加健壯和優雅。程序員應該樂于升級換代已有的知識,而學習和使用 C++11 早就是大勢所趨。
|版本聲明:山河君,未經博主允許,禁止轉載
一、std::bind概述
1.std::bind簡介
說起bind函數,應該有不少人第一反應是TCP/IP編程中用于將套接字和本地地址進行綁定的用法。而本文說的bind同樣是用于綁定。但是是用于將已有變量綁定到可調用函數的參數上。
早在C98中,就有兩個函數bind1st和bind2nd,他們被用于綁定已有變量到可執行函數的第一個參數和第二個參數,相同的是他們都只能綁定一個參數。
如果看到這還是不太明白,我們直接看例子,假如現在想遍歷一個容器中小于5的值
void fun(int i = 0, int j = 0) {if (i < j)cout << i << endl; }int main(int argv, char* argc[]) {vector<int> vecArray = { 1,2,3,4,5,6,7,8,9,10 };for_each(vecArray.begin(), vecArray.end(), bind2st(fun, 5));return 0; }此時5就被綁定到fun函數的第二個參數上了。但是bind1st和bind2st局限性太大,所以C++11中推出了std::bind。
2.std::bind原型
直接跟進bind函數,發現它實際為兩個模板函數
// FUNCTION TEMPLATE bind (implicit return type) template <class _Fx, class... _Types> _NODISCARD _CONSTEXPR20 _Binder<_Unforced, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args) {return _Binder<_Unforced, _Fx, _Types...>(_STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...); }// FUNCTION TEMPLATE bind (explicit return type) template <class _Ret, class _Fx, class... _Types> _NODISCARD _CONSTEXPR20 _Binder<_Ret, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args) {return _Binder<_Ret, _Fx, _Types...>(_STD forward<_Fx>(_Func), _STD forward<_Types>(_Args)...); }它實際上是使用一個可調用對象,通過綁定一些參數生成一個新的可調用對象。這里注意一下細節,說的是可調用對象而不是可調用接口函數。
std::bind綁定的可調用對象:
| 普通函數、靜態函數、模板函數 |
| 類成員函數、類成員靜態函數、類成員模板函數、類成員變量、類內部綁定 |
| 仿函數、Lambda表達式 |
二、使用std::bind綁定
1.綁定第一類
普通函數、靜態函數、模板函數
輸入兩個數,打印兩個數中較大的一個
毫無疑問結果都為2.
2.綁定第二類
類成員函數、類成員靜態函數、類成員模板函數、類成員變量、類內部綁定
這部分比較重要的就是要明白普通函數和類成員函數有什么區別,我們都知道的是在函數指針上面,類成員函數指針不僅要指定目標函數的形參列表和返回類型,還必須指出成員函數所屬的類。
當然類的靜態成員不屬于任何對象,因此無須特殊的指向靜態成員的指針,指向靜態成員的指針與普通指針沒有什么區別。
所以我們在bind類成員函數時,需要顯示的傳入類對象、或者類對象的引用、或者類對象的指針
如下:
3.綁定第三類
仿函數、Lambda表達式
class Compare { public:void operator()(int i, int j) { cout << (i > j ? i : j) << endl; } };int main() {auto fun1 = bind(Compare(), 1, 2); //仿函數自動實例化auto fun2 = bind([](int i, int j) {cout << (i > j ? i : j) << endl; }, 1, 2); //匿名函數fun1();fun2();return 0; }三、占位符
占位符是用于表明要綁定的參數在生成新的可執行對象的位置。有的時候我們不需要立馬進行綁定,或者不需要全部進行綁定,甚至是需要改變參數傳入的順序時候使用。
void fun(int i, int j = 2) { cout << (i > j ? i : j) << endl; }int main() {auto fun1 = bind(fun, 1, std::placeholders::_1);auto fun2 = bind(fun, std::placeholders::_1, 2); //第二個參數必須輸入,這個時候不識別默認參數auto fun3 = bind(fun, std::placeholders::_2, std::placeholders::_1);fun1(2);fun2(1);fun3(1, 2); //此時1作為第二個參數輸入,2作為第一個參數輸入return 0; }總結
仍在持續更新中~
如果對您有所幫助,請點個贊!
總結
以上是生活随笔為你收集整理的C++11新特性——std::bind参数绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类与对象PK小游戏
- 下一篇: s3c2440移植MQTT