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