function
先介绍下函数对象:
传递给算法的“函数形实参”不一定是得到的函数,也可以是行为类似函数的对象,这种对象称为函数对象,或仿函数。(类似于c的函数指针)
定义一个函数对象:
行为像函数的可以理解为就是个函数,如果定义了一个对象,行为像函数,那么他就可以当做函数使用。那么什么才算是行为像个函数?指的是可以以“使用小括号传递实参,来借调某个东西。”
function(args1,args2);
如果希望对象也如此,那么让他有可能被调用,通过小括号的运用和实参的传递,所以只需定义operator(),再给予适当的参数,(()就是函数调用运算符)
class A
{
public:
return_value operator() (args) const
{
//…
}
}
A的对象可以像函数一样来调用了
A a;
a(args,argss);
被解析为:
a.operator()(args,argss);
总结一下吧:
1.函数对象是一种带状态的函数,函数对象可以带成员变量和成员函数。
2.函数对象有自己的类型
3.函数对象通常比函数的速度快,通常许多细节在编译期间都能确定。
function
我们知道,在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++0x中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。
在使用前加:using namespace std;
static std::function<Layer*()> createFunctions[] =
{
CL(CameraTest1),
//…
};
CL是一个宏,对应的lambda表达式如下:
#define CL(__className__) [](){ return __className__::create();}
function实际上就像一个函数指针
1.可以保存自由函数
void print(int a)
{
cout<<a<<endl;
}
function<void(int a)> func;
func = print;
func(2);
2.保存lambda表达式 lambda参考http://www.cnblogs.com/tianzeng/p/8684062.html
function<void()> func_1 = [](){cout<<“hello world”<<endl;};
func_1();
3.保存成员函数
class Foo
{
public:
Foo(int num) : num_(num) {}
void print_add(int i) const
{
cout << num_+i << endl;
}
int num_;
};
// 保存成员函数
function<void(const Foo&, int)> f_add_display = &Foo::print_add;
Foo foo(2);
f_add_display(foo, 1);
function和bind配合使用
bind的使用
#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[])
{
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);
f4(m); //print:3 4
cout<<m<<endl;//print:4 说明:bind对于不事先绑定的参数,通过std::placeholders传递的参数是通过引用传递的
cout<<n<<endl;//print:2 说明:bind对于预先绑定的函数参数是通过值传递的
A a;
auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2);
f5(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);//print:10 20
return 0;
}