先介绍下函数对象:

  传递给算法的“函数形实参”不一定是得到的函数,也可以是行为类似函数的对象,这种对象称为函数对象,或仿函数。(类似于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;
}

版权声明:本文为tianzeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tianzeng/p/8711758.html