可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载函数调用操作符;

函数调用操作符必须声明为函数成员。一个类可以定义函数调用操作符的多个版本,由形参的数目或类型加以区别;

定义了调用操作符的类,其对象常称为为函数对象(function object)即它们是行为类似函数的对象;

eg.

struct absInit
{int operator() (int val){return val <0 ? -val: val;}
};struct funcObejct
{int operator() (int val1,int val2,int val3){return val1 ? val2:val3;}
};//test code
int main()
{int i = -3;absInit  absTest;std::cout<<"abs of "<<i<<" is "<<absTest(i)<<std::endl;// test funcObjectfuncObejct fun;std::cout<<fun(-1,2,3)<<std::endl;std::cout<<fun(10,2,3)<<std::endl;std::cout<<fun(0,2,3)<<std::endl;return 0;}

函数对象经常用作通用算法的实参,通过将算法中需要的Predicate 定义为函数对象可以获得更高的灵活性:

bool GT6(const std::string &s)
{return s.size() >6;
}class GT_cls
{public:GT_cls(std::size_t val = 0):bound(val) {}bool operator() (const std::string & s) { return s.size() >= bound;}private:std::string::size_type bound;
};//test code
int main()
{std::vector<std::string> words;std::string word;while(std::cin>>word){words.push_back(word);}std::vector<std::string>::size_type wc = std::count_if(words.begin(),words.end(),GT6);std::cout<<wc<<std::endl;std::vector<std::string>::size_type wc1 = std::count_if(words.begin(),words.end(),GT_cls(6));std::cout<<wc1<<std::endl;std::vector<std::string>::size_type wc2 = std::count_if(words.begin(),words.end(),GT_cls(2));std::cout<<wc2<<std::endl;return 0;}

标准库定义了一组算术,关系与逻辑运算的函数对象类,以及一组函数适配器,都是在functional 头文件中定义的;

具体请参考:http://en.cppreference.com/w/cpp/header/functional

在算犯中使用函数对象,用于覆盖算法使用的默认操作符;

标准库提供两种函数适配器:

1. binder,将一个操作数绑定给给定值而将二元函数对象转换为一元函数对象;

bind1st:将给定值绑定到函数对象的第一个实参;

bind2nd:将给定值绑定到函数对象的第二个实参;

2. negator ,将谓词函数对象的真值求反;

not1:将一元函数对象的真值求反;

not2:将二元函数对象的真值求反;

//test code
int main()
{std::vector<int> ivec;ivec.reserve(1030);for(int i = 0 ; i <1030 ;++i){ivec.push_back(i);}//find all value that is greater than 1024std::vector<int>::iterator result = std::find_if(ivec.begin() ,  ivec.end() , std::bind2nd(std::greater<int>() ,1024) );while(result != ivec.end()){std::cout<<*result<<std::endl;result = std::find_if( ++result ,  ivec.end() , std::bind2nd(std::greater<int>() ,1024) );}std::vector<std::string> svec;svec.push_back("hello world");svec.push_back("test");svec.push_back("huqijun");svec.push_back("pooh");//find all value that is not equal to "pooh"std::vector<std::string>::iterator ret = std::find_if(svec.begin(),svec.end(),std::bind2nd(std::not_equal_to<std::string>(),"pooh") );while(ret != svec.end()){std::cout<<*ret<<std::endl;ret = std::find_if(++ret,svec.end(),std::bind2nd(std::not_equal_to<std::string>(),"pooh") );}//double every valuestd::vector<int> ivec2;ivec2.reserve(12);for(int i = 0; i<12 ; ++i){ivec2.push_back(i);}std::for_each(ivec2.begin(),ivec2.end(),std::bind2nd(std::multiplies<int>(),2) );for(std::vector<int>::iterator i = ivec2.begin() ;  i!= ivec2.end()  ; ++i){std::cout<<*i<<std::endl;}return 0;}

C++ 之函数调用操作符和函数对象相关推荐

  1. C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象

    重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt {int operator() (int va ...

  2. C++面向对象操作符重载:调用操作符和函数对象

    1.定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象. 可以为类类型的对象重载函数调用操作符.一般为表示操作的类重载调用操作符.函数调用操作符必须声明为成员函数.一个类可以定义函 ...

  3. 调用操作符和函数对象

    p451-p467 今天不看完第三部分不睡觉-!!!!!!!!!!!!!!!!!!日,明天还要爬山.. 简单说来,就是可以把对象当成函数看 //函数对象, #include"head.h&q ...

  4. 【C++】什么是函数对象和函数对象的用处

    目录 什么是函数对象 函数对象的用处 什么是函数对象 class myprint {public:void operator()(int num){cout << "num &q ...

  5. Boost Part III. 函数对象与高级编程 Library 10. Lambda 用法

    让你的函数对象可以与Boost.Lambda 一起使用 不是所有的表达式都适合使用 lambda 表达式,复杂的表达式更适合使用普通的函数对象,而且会多次重用的表达式也应该成为你代码中的一等公民.它们 ...

  6. C++ 重载函数调用运算符 | 再探lambda,函数对象,可调用对象

    文章目录 重载函数调用运算符 lambda lambda等价于函数对象 lambda等价于类 标准库函数对象 可调用对象与function 可调用对象 function 函数重载与function 重 ...

  7. C++中函数调用操作符的重载

    文章目录 1 C++中函数调用操作符的重载 1.1 函数调用操作符的重载 1 C++中函数调用操作符的重载 1.1 函数调用操作符的重载 函数调用操作符的重载: 只能通过类的成员函数重载. 可以定义不 ...

  8. STL算法中函数对象和谓词

    算法中函数对象和谓词 函数对象和谓词定义 函数对象 谓词 一元函数对象案例 一元谓词案例 二元函数对象案例 二元谓词案例 预定义函数对象和函数适配器 使用预定义函数对象 算术函数对象 关系函数对象 逻 ...

  9. 【转】回调函数,函数指针与函数对象

    原文出处:http://shudingbo.spaces.live.com/blog/cns!C33400475B08F157!423.entry?wa=wsignin1.0&sa=24651 ...

最新文章

  1. floyd 判圈算法 UVa 11549 计算器谜题
  2. 守望者的逃离—贪心算法
  3. ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O)
  4. Java SE 11(18.9)中的API更新
  5. C#利用委托实现窗体间的值传递
  6. C# 将控件的Controls属性下的所有控件取出以便使用LINQ语句进行查询
  7. aws消息服务器,经验分享:我们如何使用AWS构建无服务器架构 - hypertrack
  8. 面对自然灾害,科技能做什么?
  9. MySQL ( Ubuntu16.04 )
  10. 白话空间统计之:空间自相关
  11. c语言炒股软件公式,股票软件怎么使用指标选股公式
  12. 电磁学matlab仿真实验报告,利用MATLAB语言处理电磁学实验.doc
  13. linux压缩文件方式,在 Linux 上压缩文件的 5 种方法
  14. Genymotion启动失败解决方案
  15. IntelliJ IDEA自定义菜单(Menus)、任务栏(toolbars)详细教程(即Customize Menus and Toolbars...)
  16. 浮点数为什么不精确?
  17. 2022年上半年软件设计师考试下午真题(专业解析+参考答案)
  18. 安卓基础学习 Day 6|常用控件---列表视图+古诗查看
  19. 【安全测试】数据安全性
  20. python色卡_python plt 色卡

热门文章

  1. TFN DP16A 对数周期天线 100MHz~6GHz
  2. Vue中引入富文本编辑器
  3. 有关单引号,双引号,三引号的使用方法
  4. MATLAB激活后打开仍为激活页面
  5. 对“基础算法(LeetCode)刻意练习活动”的复盘
  6. 15天共读深度学习Day6
  7. ipad访问ftp文件服务器,ipad肿么访问ftp
  8. 7-1 温度转换 (100 分)
  9. 51信用卡的个性化推荐体系
  10. 领袖六种能力与七大根性(余世维)