function是一组函数对象包装类的模板,实现了一个泛型的回调机制。
引入头文件
#include
using namespace std;
using namespace std::placeholders; //bind的时候会用`
参考:http://www.cnblogs.com/hujian/archive/2012/12/07/2807605.html
fuction bind:http://blog.csdn.net/fjb2080/article/details/7527715
我们可以调用的对象有很多,比如普通函数、函数指针、lanmbda表达式、函数对象和类的成员函数等。
不管采用哪种方式,主要调用形式一样(返回值类型、传递给调用的实参类型),我们就可以使用同一种形式来调用。
这个时候就可以用到function模板,它给予我们在调用的方式上更大的弹性。
请看一下三种不同的函数定义:
int add(int a, int b){
return a+b;
}
auto mod=[](int a, int b){return a%b;};
struct divide{
int operator()(int m, int n){
return m/n;
}
};
这三种都可以使用同一种调用形式,int(int, int),调用方式如下:
function func1= add;
function func2= divide();
function func3= mod;
cout<
map> funs =
{
{"+", add},
{"-", std::minus()},//标准库的函数,参数为两个整数,可以参考前一篇博客
{"/", divide()},//类成员函数
{"*", [](int i,int j){return i*j;}},//lambda表达式
{"%", mod},
};
funs["+"](4,6);
class CAdd
{
public:
CAdd():m_nSum(0){NULL;}
int operator()(int i)
{
m_nSum += i;
return m_nSum;
}
int Sum() const
{
return m_nSum;
}
private:
int m_nSum;
};
int main(int argc, const char * argv[])
{
CAdd cAdd;
function funcAdd1 = cAdd;
function funcAdd2 = cAdd;
cout<
上面的输出结果是 10 10 0。我们将同一个函数对象赋值给了两个function,然后分别调用这两个function,但函数中的成员变量的值没有保存,问题在哪里?因为function的缺省行为是拷贝一份传递给它的函数对象,于是f1,f2中保存的都是cAdd对象的拷贝。
C++11提供了ref和cref函数来提供对象的引用和常引用的包装。要是function能够正确保存函数对象的状态,可以如下修改代码:
function funcAdd3 = ref(cAdd);
function funcAdd4 = ref(cAdd);
cout<