C++11 function使用
来源:互联网 发布:大连弘历软件 编辑:程序博客网 时间:2024/04/28 17:16
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模板,它给予我们在调用的方式上更大的弹性。
请看一下三种不同的函数定义:
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<int(int,int)> func1= add; function<int(int,int)> func2= divide(); function<int(int,int)> func3= mod; cout<<func1(5, 6)<<endl; cout<<func2(5, 6)<<endl; cout<<func3(5, 6)<<endl;
学会了使用function,可以继续如下进行抽象定义,不同类型采用相同的调用方法:
map<string,function<int(int, int)>> funs = { {"+", add}, {"-", std::minus<int>()},//标准库的函数,参数为两个整数,可以参考前一篇博客 {"/", divide()},//类成员函数 {"*", [](int i,int j){return i*j;}},//lambda表达式 {"%", mod}, }; funs["+"](4,6);
以上就是function的简单使用。下面是从另一篇博客转载的,使用function的引用来保存函数对象。考虑下面代码:
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<int(int)> funcAdd1 = cAdd; function<int(int)> funcAdd2 = cAdd; cout<<funcAdd1(10)<<endl; cout<<funcAdd2(10)<<endl; cout<<cAdd.Sum()<<endl; return 0;}
上面的输出结果是 10 10 0。我们将同一个函数对象赋值给了两个function,然后分别调用这两个function,但函数中的成员变量的值没有保存,问题在哪里?因为function的缺省行为是拷贝一份传递给它的函数对象,于是f1,f2中保存的都是cAdd对象的拷贝。
C++11提供了ref和cref函数来提供对象的引用和常引用的包装。要是function能够正确保存函数对象的状态,可以如下修改代码:
function<int(int)> funcAdd3 = ref(cAdd); function<int(int)> funcAdd4 = ref(cAdd); cout<<funcAdd3(10)<<endl; cout<<funcAdd4(10)<<endl; cout<<cAdd.Sum()<<endl;
0 0
- C++11 function使用
- c++11 function使用
- c++:使用function模板和bind函数
- C Function
- c-function
- [C/C++11]_[初级]_[使用std::function来封装函数]
- Item 11: 比起private undefined function优先使用deleted function
- 【C++】C++11特性:lambda和function
- [C++]C++11:Function与Bind
- std::bind绑定器、std::function、extern C的使用
- C++ 11 std::function std::bind使用
- C++11中std::function的使用
- C++11 bind与function使用备忘
- C function strtok()
- Linux C function() 参考手册
- Const Member Function(C++)
- C LOG function
- linux C - popen() function
- Android--SQLite(增,删,改,查)操作
- C#获取Word文档结构图 并且转成Datatable表格
- python import与from...import....的区别
- 关于JS中的constructor与prototype
- String和StringBuilder的简单对比
- C++11 function使用
- 【multimap/pair/数组】#28 A. Bender Problem
- 新加坡公民与国人结婚的比例呈增长趋势
- 类的加载顺序
- flex的渲染两种用法
- Machine Learning Done Wrong(机器学习七种易犯的错误)
- eclipse的问题帖子
- HTTPS的压力测试工具 -- httperf
- 第七周作业--背包问题