C++11 function使用

简介: function是一组函数对象包装类的模板,实现了一个泛型的回调机制。 引入头文件 #include using namespace std;using namespace std::placeholders;  //bind的时候会用` 参考:http://www.

function是一组函数对象包装类的模板,实现了一个泛型的回调机制。

引入头文件

#include <functional>
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模板,它给予我们在调用的方式上更大的弹性。

请看一下三种不同的函数定义:

 

[cpp]  view plain  copy
 
 print?
  1. int add(int a, int b){  
  2.     return a+b;  
  3. }  
  4. auto mod=[](int a, int b){return a%b;};  
  5. struct divide{  
  6.     int operator()(int m, int n){  
  7.         return m/n;  
  8.     }  
  9. };  

 

这三种都可以使用同一种调用形式,int(int, int),调用方式如下:

 

[cpp]  view plain  copy
 
 print?
  1. function<int(int,int)> func1= add;  
  2. function<int(int,int)> func2= divide();  
  3. function<int(int,int)> func3= mod;  
  4. cout<<func1(5, 6)<<endl;  
  5. cout<<func2(5, 6)<<endl;  
  6. cout<<func3(5, 6)<<endl;  


学会了使用function,可以继续如下进行抽象定义,不同类型采用相同的调用方法:

 

 

[cpp]  view plain  copy
 
 print?
  1. map<string,function<int(int, int)>> funs =  
  2. {  
  3.     {"+", add},  
  4.     {"-", std::minus<int>()},//标准库的函数,参数为两个整数,可以参考前一篇博客  
  5.     {"/", divide()},//类成员函数  
  6.     {"*", [](int i,int j){return i*j;}},//lambda表达式  
  7.     {"%", mod},  
  8. };  
  9. funs["+"](4,6);  


以上就是function的简单使用。下面是从另一篇博客转载的,使用function的引用来保存函数对象。考虑下面代码:

 

 

[cpp]  view plain  copy
 
 print?
  1. class CAdd  
  2. {  
  3. public:  
  4.     CAdd():m_nSum(0){NULL;}  
  5.     int operator()(int i)  
  6.     {  
  7.         m_nSum += i;  
  8.         return m_nSum;  
  9.     }  
  10.       
  11.     int Sum() const  
  12.     {  
  13.         return m_nSum;  
  14.     }  
  15.       
  16. private:  
  17.     int m_nSum;  
  18. };  
  19. int main(int argc, const char * argv[])  
  20. {  
  21.     CAdd cAdd;  
  22.     function<int(int)> funcAdd1 = cAdd;  
  23.     function<int(int)> funcAdd2 = cAdd;  
  24.     cout<<funcAdd1(10)<<endl;  
  25.     cout<<funcAdd2(10)<<endl;  
  26.     cout<<cAdd.Sum()<<endl;  
  27.       
  28.      return 0;  
  29. }  

 

上面的输出结果是 10 10 0。我们将同一个函数对象赋值给了两个function,然后分别调用这两个function,但函数中的成员变量的值没有保存,问题在哪里?因为function的缺省行为是拷贝一份传递给它的函数对象,于是f1,f2中保存的都是cAdd对象的拷贝。

C++11提供了ref和cref函数来提供对象的引用和常引用的包装。要是function能够正确保存函数对象的状态,可以如下修改代码:

 

[cpp]  view plain  copy
 
 print?
  1. function<int(int)> funcAdd3 = ref(cAdd);  
  2. function<int(int)> funcAdd4 = ref(cAdd);  
  3. cout<<funcAdd3(10)<<endl;  
  4. cout<<funcAdd4(10)<<endl;  
  5. cout<<cAdd.Sum()<<endl;  

 

 

        另外,两个function之间赋值时,如果源function保存的是函数对象的拷贝,则目标function保存的也是函数对象的拷贝。如果源function保存的是对函数对象的引用,则目标function保存的也是函数对象的引用。

目录
相关文章
|
9月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
129 5
|
5月前
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
108 9
|
7月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
69 6
|
7月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
9月前
|
程序员 编译器 C++
C++中的函数重载(Function Overloading)
C++中的函数重载(Function Overloading)
105 2
|
9月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
77 2
|
9月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
65 1
|
9月前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
121 1
|
8月前
|
算法 编译器 C++
C++多态与虚拟:函数重载(Function Overloading)
重载(Overloading)是C++中的一个特性,允许不同函数实体共享同一名称但通过参数差异来区分。例如,在类`CPoint`中,有两个成员函数`x()`,一个返回`float`,另一个是设置`float`值。通过函数重载,我们可以为不同数据类型(如`int`、`float`、`double`)定义同名函数`Add`,编译器会根据传入参数自动选择正确实现。不过,仅返回类型不同而参数相同的函数不能重载,这在编译时会导致错误。重载适用于成员和全局函数,而模板是另一种处理类型多样性的方式,将在后续讨论中介绍。
|
9月前
|
Java 编译器 Linux
【C++11(二)】lambda表达式以及function包装器
【C++11(二)】lambda表达式以及function包装器

热门文章

最新文章