C++11 std::bind 和 std::placeholder
std::bind 則是用來綁定函數調用的參數的, 它解決的需求是我們有時候可能并不一定能夠一次性獲得調用某個函數的全部參數,通過這個函數, 我們可以將部分調用參數提前綁定到函數身上成為一個新的對象,然后在參數齊全后,完成調用。
std::placeholder,當分批付給函數參數的過程中,如果還沒有賦值的參數,使用 std::placeholder 進行占位,意思時該位置的參數現在還不清楚,后期再賦值。
#include <functional> #include <iostream>void foo(int a, int b, int c) {std::cout << "a = " << a << " b = " << b << " c = " << c << std::endl; } int main() {// 將參數 2,3 綁定到函數 foo 參數 b 和 c 上,但是使用 std::placeholders::_1 來對第一個參數進行占位。auto bindFoo = std::bind(foo, std::placeholders::_1, 2, 3);// 這時調用 bindFoo 時,只需要提供第一個參數即可bindFoo(1);return 0; }下面是圖解 bind 函數部分。
1、bind?可以用來將用戶提供的需要一個參數的函數轉換成不需要參數的函數對象。綁定的值(在這個例子中是 123)存儲在函數對象內并且會被自動傳遞給用戶指定的函數。
2、參數綁定也可以用于將類成員函數轉換成零參數的函數對象。猿類們都知道,非靜態成員函數需要一個隱式的?this?參數。這意味著需要綁定一個合適的類實例指針到這個函數對象。
3、相應地,隱式的?this?指針也可以顯式地傳遞給需要一個參數的函數對象。
4、函數對象經常同時使用提前綁定的參數和調用時才提供的參數。這個可以用成員函數來實現。
5、當然也可以使用非成員函數。
6、有些時候函數對象被調用時會提供多余的參數,而這些參數是目標函數不需要的。bind?會自動忽略這些多余的參數。
7、這些多余的參數不需要一定在函數對象簽名的最后。
8、最后,?bind?還允許重新組織函數對象的參數順序。
?
圖解部分轉載于:https://www.cnblogs.com/xusd-null/p/3698969.html
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的C++11 std::bind 和 std::placeholder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11 std::function
- 下一篇: 批处理命令 / cd