今天開始逐一學習c++11的新用法,從std::function 與 std::bind函數開始。
std::function 是一個template, 在一對<>中指定類型。 std::function<int(int, int)> 表明定義的是一個有兩個int類型的參數,并且傳回一個int類傳回值的函數對象,這個傳回的可調用對象可以了解為函數指針。
具體用法 std::function<傳回值<>參數清單>
std::function 可以了解成為函數指針,
作用:
1.儲存一般函數
void printA(int a)
{
cout << a << endl;
}
std::function<void(int a)> func;
func = printA;
func(2); //2
2.儲存lambda表達式
std::function<void()> func_1 = [](){cout << "hello world" << endl;};
func_1(); //hello world
3.儲存成員函數
class Foo{
Foo(int num) : num_(num){}
void print_add(int i) const {cout << num_ + i << endl;}
int num_;
};
//儲存成員函數
std::function<void(const Foo&, int)> f = &Foo::print_add;
Foo foo(2);
f(foo,1);
.在實際使用中,可使用auto關鍵字。
關于bind的用法:
可将bind函數看作是一個通用的函數擴充卡,它接受一個可調用對象,生成一個新的可調用對象來“适應”原對象的參數清單。
調用bind的一般形式:auto newCallable = bind(callable,arg_list);
其中,newCallable本身是一個可調用對象,arg_list是一個逗号分隔的參數清單,對應給定的callable的參數。即,當我們調用newCallable時,newCallable會調用callable,并傳給它arg_list中的參數。
arg_list中的參數可能包含形如_n的名字,其中n是一個整數,這些參數是“占位符”,表示newCallable的參數,它們占據了傳遞給newCallable的參數的“位置”。數值n表示生成的可調用對象中參數的位置:_1為newCallable的第一個參數,_2為第二個參數,以此類推。 from 《C++ primer》
#include <iostream>
using namespace std;
class A
{
public:
void fun_3(int k,int m)
{
cout<<k<<" "<<m<<endl;
}
};
void fun(int x,int y,int z)
{
cout<<x<<" "<<y<<" "<<z<<endl;
}
void fun_2(int &a,int &b)
{
a++;
b++;
cout<<a<<" "<<b<<endl;
}
int main(int argc, const char * argv[])
{
//f1的類型為 function<void(int, int, int)>
auto f1 = std::bind(fun,1,2,3); //表示綁定函數 fun 的第一,二,三個參數值為: 1 2 3
f1(); //print:1 2 3
auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3);
//表示綁定函數 fun 的第三個參數為 3,而fun 的第一,二個參數分别由調用 f2 的第一,二個參數指定
f2(1,2);//print:1 2 3
auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3);
//表示綁定函數 fun 的第三個參數為 3,而fun 的第一,二個參數分别由調用 f3 的第二,一個參數指定
//注意: f2 和 f3 的差別。
f3(1,2);//print:2 1 3
int n = 2;
int m = 3;
auto f4 = std::bind(fun_2, n,placeholders::_1); //表示綁定fun_2的第一個參數為n, fun_2的第二個參數由調用f4的第一個參數(_1)指定。
f4(m); //print:3 4
cout<<m<<endl;//print:4 說明:bind對于不事先綁定的參數,通過std::placeholders傳遞的參數是通過引用傳遞的,如m
cout<<n<<endl;//print:2 說明:bind對于預先綁定的函數參數是通過值傳遞的,如n
A a;
//f5的類型為 function<void(int, int)>
auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2); //使用auto關鍵字
f5(10,20);//調用a.fun_3(10,20),print:10 20
std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);
fc(10,20);//調用a.fun_3(10,20) print:10 20
return 0;
}