日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11新特性——std::bind参数绑定

發布時間:2023/12/20 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.綁定第一類

普通函數、靜態函數、模板函數
輸入兩個數,打印兩個數中較大的一個

void fun1(int i, int j){ cout << (i > j ? i : j) << endl; } //普通函數static void fun2(int i, int j) { cout << (i > j ? i : j) << endl; } //靜態函數template <typename T1 = int, typename T2 = int> void fun3(T1 i, T2 j) { cout << (i > j ? i : j) << endl; } //模板函數int main() {auto fun1Test = bind(fun1, 1, 2);auto fun2Test = bind(fun2, 1, 2);auto fun3Test = bind(fun3<>, 1, 2);fun1Test();fun2Test();fun3Test();return 0; }

毫無疑問結果都為2.

2.綁定第二類

類成員函數、類成員靜態函數、類成員模板函數、類成員變量、類內部綁定

這部分比較重要的就是要明白普通函數和類成員函數有什么區別,我們都知道的是在函數指針上面,類成員函數指針不僅要指定目標函數的形參列表和返回類型,還必須指出成員函數所屬的類

當然類的靜態成員不屬于任何對象,因此無須特殊的指向靜態成員的指針,指向靜態成員的指針與普通指針沒有什么區別。

所以我們在bind類成員函數時,需要顯示的傳入類對象、或者類對象的引用、或者類對象的指針
如下:

class Test { public:void fun1(int i, int j) { cout << (i > j ? i : j) << endl; } //類成員普通函數static void fun2(int i, int j) { cout << (i > j ? i : j) << endl; } //類靜態函數template <typename T1 = int, typename T2 = int>void fun3(T1 i, T2 j) { cout << (i > j ? i : j) << endl; } //類模板函數void fun4() { auto fun1Test = bind(&Test::fun1, this, 1, 2); fun1Test(); }; //類內部使用public:int m_X = 10; };int main() {Test test;Test* pTest = &test;auto fun1Test = bind(&Test::fun1, test, 1, 2); //傳入類對象auto fun2Test = bind(Test::fun2, 1, 2); //因為靜態函數,所以無需傳入類auto fun3Test = bind(&Test::fun3<>, &test, 1, 2); //傳入類引用auto memberVar = std::bind(&Test::m_X, pTest); //傳入類對象指針fun1Test();fun2Test();fun3Test();test.fun4(); //類內部使用,直接使用thiscout << memberVar() << endl;return 0; }

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参数绑定的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。