C++11 function
来源:互联网 发布:红叶知弦调教片段 编辑:程序博客网 时间:2024/05/16 14:51
http://www.cnblogs.com/hujian/archive/2012/12/07/2807605.html
function是一组函数对象包装类的模板,实现了一个泛型的回调机制。function与函数指针比较相似,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数,也可以是函数对象和类的成员函数,而且可以给函数添加状态。
声明一个function时,需要给出所包装的函数对象的返回值类型和各个参数的类型。比如,声明一个function,它返回一个bool类型并接受一个int类型和一个float类型的参数,可以像下面这样:
function<bool (int, float)> f;
function();
template <typename F> function(F g);
template <typename F> function(reference_wrapper<F> g);
function& operator=(const function& g);
template<typename F> function& operator=(F g);
bool empty() const;
void clear();
result_type operator()(Arg1 a1, Arg2 a2, ..., ArgN aN) const;
下面分别给出使用function来包装普通函数,函数对象和类的成员函数的参考代码。
1、普通函数
1 int Add(int x, int y)2 3 {4 return x+y;5 }6 function<int (int,int)> f = Add;7 int z = f(2, 3);
2、函数对象
1 class CStudent 2 { 3 public: 4 void operator() (string strName, int nAge) 5 { 6 cout << strName << " : " << nAge << endl; 7 } 8 }; 9 10 CStudent stu;11 function<void (string, int)> f = stu;12 f("Mike", 12);
3、类的成员函数
1 struct TAdd 2 { 3 int Add(int x,int y) 4 { 5 return x+y; 6 } 7 }; 8 9 function<int (TAdd *, int, int)> f = TAdd::Add;10 TAdd tAdd;11 f(&tAdd, 2, 3); // 如果前面的模板参数为传值或引用,直接传入tAdd即可
接下来我们来看看使用function来保存函数对象状态的情况。考虑下面的代码:
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 20 int main() 21 {22 CAdd add;23 function<int (int)> f1 = add;24 function<int (int)> f2 = add;25 cout << f1(10) << "," << f2(10) << "," << add.Sum() << endl;26 return 0;27 }
C++ 11中提供了ref和cref函数,来提供对象的引用和常引用的包装。要使function能够正确地保存函数对象的状态,我们可以这样来修改代码:
1 CAdd add;2 function<int(int)> f1 = ref(add);3 function<int(int)> f2 = ref(add);
标签: C++ 11
0 0
- C Function
- c-function
- 【C++】C++11特性:lambda和function
- [C++]C++11:Function与Bind
- C function strtok()
- Linux C function() 参考手册
- Const Member Function(C++)
- C LOG function
- linux C - popen() function
- C++Primer-Function chapter
- C#_delegate - combine function
- C callback function example
- C语言-Function
- C library function - memset()
- C--3 (Array, Function
- COBOL call C function
- C. Leha and Function
- jquery function(n,c)
- 颠倒单词在字符串中的顺序
- 树状数组
- HODJ1004
- toString 详解
- C++ 11 tuple & 可变参数模板
- C++11 function
- 【CodeForces】38G Queue 伸展树
- 致我们终将忘记的算法(单链表那些事)
- std::ostringstream 使用
- adr和ldr的区别
- PAT 1044. Shopping in Mars (25)
- C++ 11 bind
- HDU 1875 畅通工程
- C++ 11智能指针之shared_ptr