C++中的可调用对象分为以下几种:

  • 函数
  • 函数指针
  • lambda表达式
  • bind创建的对象
  • 重载了函数调用运算符(即“()”)的类

函数、函数指针不再介绍。lambda表达式与bind创建的类参考——lambda表达式和bind函数。

 
这里通过例子说明一下lambda表达式与重载了函数调用运算符的类有一些相通之处。

lambda是函数对象,是一个可调用对象。编译器在解释lambda表达式时,将其解释为一个未命名类的未命名对象,该类重载了函数调用运算符。
1、首先声明一个类,重载函数调用运算符。成员变量根据实际情况而定。
  1. /**
  2. * 重载了函数调用运算符的类
  3. */
  4. classSizeComp
  5. {
  6. public:
  7. SizeComp(std::size_t sz): size(sz){}
  8. voidoperator()(const string & str)const
  9. {
  10. if(str.size()>= size)
  11. {
  12. cout << str << endl;
  13. }
  14. }
  15. private:
  16. std::size_t size;
  17. };
2、创建类对象,并给需要用到的变量进行赋值。
  1. void testInvoke2nd()
  2. {
  3. vector<string> strVec ={"1","12","123","1234","12345","123456","1234567"};
  4. std::size_t sz =5;
  5. cout <<"lambda表达式:"<< endl;
  6. auto comp =[sz](const string & str)->void
  7. {
  8. if(str.size()>= sz)
  9. {
  10. cout << str << endl;
  11. }
  12. };
  13. for_each(strVec.begin(), strVec.end(), comp);
  14. cout <<"()运算符重载:"<< endl;
  15. for_each(strVec.begin(), strVec.end(),SizeComp(sz)); // 先是调用构造函数创建一个临时对象
  16. }
 
对可调用对象的使用
  1. #include<iostream>
  2. #include<functional>
  3. #include<map>
  4. usingnamespace std;
  5. /**< 可调用对象——函数 */
  6. /**
  7. * 若进行函数重载则不能直接使用函数名
  8. * 会产生二义性
  9. * 此时考虑函数指针或其他的实现方式
  10. */
  11. //implements "+" operation
  12. constint addInt(constint x,constint y)
  13. {
  14. return x + y;
  15. }
  16. /**< 可调用对象——重载了调用运算符的类 */
  17. //implements "-" operation
  18. struct minusInt
  19. {
  20. constintoperator()(constint x,constint y)
  21. {
  22. return x - y;
  23. }
  24. };
  25. //函数指针所指向的函数
  26. constint dividesFunc(constint x,constint y)
  27. {
  28. return x / y;
  29. }
  30. void testFunction()
  31. {
  32. /**< 可调用对象——lambda表达式 */
  33. //implements "*" operation
  34. auto multipInt =[](constint x,constint y)->constint
  35. {
  36. return x * y;
  37. };
  38. /**< 可调用对象——函数指针 */
  39. //implements "/" operation
  40. constint(*dividesInt)(int,int)= dividesFunc;
  41. // dividesInt = multipInt; // 说明lambda是一个函数对象
  42. /**
  43. * function<int(int, int)>的原型是function<T>
  44. * @brief 存储可调用对象(该对象的调用形式应该与T相同)
  45. * @param T 函数类型(返回值类型,参数个数及)
  46. */
  47. map<string, function<int(int,int)>> binops =
  48. {
  49. {"+", addInt},/* 函数名默认转化为函数指针类型 */
  50. {"-", minusInt()},/* 创建一个类对象 */
  51. {"*", multipInt},/* lambda表达式类型的对象 */
  52. {"/", dividesInt}/* 函数指针 */
  53. };
  54. cout << binops["+"](10,5)<< endl
  55. << binops["-"](10,5)<< endl
  56. << binops["*"](10,5)<< endl
  57. << binops["/"](10,5)<< endl;
  58. }
  59. int main()
  60. {
  61. testFunction();
  62. return0;
  63. }
 
 

C++之可调用对象的更多相关文章

  1. C/C++: C++可调用对象详解

    C++中有几种可调用对象:函数,函数指针,lambda表达式,bind创建的对象,以及重载了函数调用符的类. 1. 函数 函数偏基础的东西,在这里不再叙述.重点讲下C++11的某些重要特性和函数指针. ...

  2. Oracle自定义数据类型 2 (调用对象方法)

    调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义 ...

  3. Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)

    Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...

  4. C++中的各种可调用对象

    概述 一组执行任务的语句都可以视为一个函数,一个可调用对象.在程序设计的过程中,我们习惯于把那些具有复用性的一组语句抽象为函数,把变化的部分抽象为函数的参数. 函数的使用能够极大的极少代码重复率,提高 ...

  5. .Net 之 RPC 框架之Hprose(远程调用对象)

    实现远程调用对象,跨进程访问对象,可实现分布式 首先给服务端和客户端 nuget Hprose 可使用tcp和http两种调用方式 服务端 using Hprose.Server; using Sys ...

  6. Python中的7种可调用对象

    Python中有七种可调用对象,可调用对象可使用内置函数callable来检测 一.用户自定义的函数: 使用def语句或者lambda表达式创建的函数. 二.内置函数: 使用C语言实现的函数,如len ...

  7. python 可调用对象之类实例

    可调用对象,即任何可以通过函数操作符()来调用的对象. python可调用对象大致可以分为4类: 1.函数 python中有三种函数:内建函数(BIFs).用户自定义函数(UDF).lambda表达式 ...

  8. 第12课 std::bind和std::function(3)_std::function可调用对象包装器

    1. std::function (1)首先是一个类模板,用于包装可调用对象.可以容纳除了类成员(函数)指针之外的所有可调用对象. (2)可以将普通函数,lambda表达式和函数对象类统一起来.尽管它 ...

  9. 第10课 std::bind和std::function(1)_可调用对象

    1. 几种可调用对象(Callable Objects) (1)普通函数指针或类成员的函数指针 (2)具有operator()成员函数的类对象(仿函数).如c++11中的std::function类模 ...

  10. python在交互模式下直接输入对象后回车,调用的是对象的__repr__()方法,这个方法表示的是一个编码,用print+对象是调用对象的__str__方法

    交互模式下调用对象的__repr__()方法,这个方法表示的是一个编码 >>> u"国庆节快乐"u'\u56fd\u5e86\u8282\u5feb\u4e50' ...

随机推荐

  1. 【线性基/神仙题】P4151 [WC2011]最大XOR和路径

    Description 给定一个无向连通图,边有边权,求一个 \(1~\sim n\) 的路径,最大化边权的异或和.如果一条边经过多次则计算多次. Input 第一行是两个整数 \(n,m\) 代表点 ...

  2. HTTP返回代码 201 304 404 500等代表的含义

    在网站日志中,我们经常会看到很多返回的http代码,如201.304.404.500等等.可是这些具体的返回的HTTP代码究竟什么含义呢,在此做一下知识普及吧,记不住不要紧,到时候看看就行了,但最主要 ...

  3. mysql 中的共享锁和排他锁

    共享锁(share lock) 共享锁又称读锁,是读取操作创建的锁.其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁. 如果事务T对数据A加上共享锁 ...

  4. Lowest Common Ancestor in a Binary Tree

    二叉树最低公共祖先节点 acmblog If one key is present and other is absent, then it returns the present key as LC ...

  5. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...

  6. poj 1961 Period

    Period http://poj.org/problem?id=1961 Time Limit: 3000MS   Memory Limit: 30000K       Description Fo ...

  7. 多年前写的DataTable与实体类的转换

    介绍 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中,有意向将两者的模型结合起来,利用DataTable中的行状态完善一些mvc中的数据控制作用.现在把它放出来,留个纪 ...

  8. iOS AES128 CBC No Padding加密解密

    最近的项目中数据传输用到加密,项目选择了AES128 CBC No Padding加密方式,PHP和Android方面的代码网上太多了.但是唯独没有iOS的,但是也有别的写法,但不是是AES128 C ...

  9. 早该知道的7个JavaScript技巧

    我写JavaScript代码已经很久了,都记不起是什么年代开始的了.对于JavaScript这种语言近几年所取得的成就,我感到非常的兴奋:我很幸运也是这些成就的获益者.我写了不少的文章,章节,还有一本 ...

  10. bzoj 3790 神奇项链(Manacher,DP+BIT | 贪心)

    [题意] 你可以产生一个回文串,也可以将两个串合并成一个串,问产生目标串需要的最少合并次数. [思路] 显然我们要先产生目标串中包含的极大回文字符串. Manacher求出每个位置可以向两边延伸的最长 ...