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