函數對象包裝器
一、std::function
Lambda表達式的本質是一個函數對象,當lambda表達式的捕獲列表爲空時,Lambda表達式還能作爲一個函數指針進行傳遞:
#include <iostream>
using foo = void (int);
void functional(foo f)
{
f(1);
}
int main()
{
auto f = [](int value)
{
std::cout<<value<<std::endl;
};
functional(f); //函數指針調用
f(1); //lambda表達式調用
return 0;
}
std::function 是一種通用、多態的函數封裝,它的實例可以對任何可以調用的目標實體進行存儲、複製和調用操作,它也是對C++中現有的可調用實體的一種類型安全的包裹,就是函數的容器,這樣可以更加方便的將函數、函數指針作爲對象進行處理。例如:
#include <functional>
#include <iostream>
int foo(int para) {
return para;
}
int main() {
// std::function 包裝了一個返回值爲 int, 參數爲 int 的函數
std::function<int(int)> func = foo;
int important = 10;
std::function<int(int)> func2 = [&](int value) -> int {
return 1+value+important;
};
std::cout << func(10) << std::endl;
std::cout << func2(10) << std::endl;
}
二、std::bind/std::placeholder
std::bind 是用來綁定函數調用的參數的,它解決的需求是:有時候可能並不一定能一次性獲得調用某個函數的全部參數。通過這個函數,可以將部分調用參數提前綁定到函數身上,成爲一個新的對象,然後在參數齊全後,完成調用:
#include <iostream>
#include <functional>
int foo(int a, int b, int c) {
std::cout<<a<<" "<<b<<" "<<c;
return 0;
}
int main() {
// 將參數1,2綁定到函數 foo 上,但是使用 std::placeholders::_1 來對第一個參數進行佔位
auto bindFoo = std::bind(foo, std::placeholders::_1, 1,2);
// 這時調用 bindFoo 時,只需要提供第一個參數即可
bindFoo(6);
return 0;
}