1、什么是函数对象?
定义了调用操作符的类,其对象常成为函数对象,即他们是行为类型函数的对象。如下例子所示:
1 struct absInt 2 { 3 int operator() (int val) 4 { 5 return val < 0 ? - val:val; 6 } 7 }; 8 9 int _tmain( int argc, char** argv ) 10 { 11 int i = -42; 12 absInt absObj; 13 absObj(i); 14 15 return 0; 16 }
2、函数对象用作算法的实参
举下面一个例子:分析一组故事中的单词,计算有多少单词长度在6字符以上。该解决方案的一个部分包括定义一个函数已确定给的单词长度在6字符以上。
1 bool GT6(const string &s) 2 { 3 return s.size >= 6; 4 }
使用GT6作为实参传递给count_if,计算使GT6返回true的单词的数目:
1 vector<string> words; 2 vector<string>::size_type wc = count_if(words.begin(),words.end(),GT6);
我们发现将6这个数字固定在GT6函数定义中。count_if算法运行只用一个形参且返回bool的函数。理想情况下,我们应该传递我们想要的长度进行测试。通过函数对象方式,我们可以使用同意代码对不同长度的字符串进行计数。定义如下所示:
1 class GT_cls 2 { 3 public: 4 GT_cls(size_t val = 0):bound(val) {} 5 bool operator() (const string &s) 6 { 7 return s.size >= bound; 8 } 9 10 private: 11 size_t bound; 12 };
我们可以向下面这样使用:
1 vector<string> words; 2 vector<string>::size_type wc = count_if(words.begin(),words.end(),GT_cls(6));
这样我们就可随便计算有多少单词长度在字符以上了。