重载运算符 标准库function的用法

问题:int(int, int)算不算一种比较通用的类型??

比如函数: int add(int a, int b);

比如lambda:auto mod = [](int a, int b){return a % b};

比如函数对象类:int operator()(int a, int b);

上面3个的共同特征就是:int(int, int),但是如何让上面的3种形式变成共同的的呢???

答案:使用function类。

std::function<int(int, int)> f1 = add;
std::function<int(int, int)> f2 = mod;
std::function<int(int, int)> f3 = divide();
std::cout << f1(1,2) << std::endl;
std::cout << f2(4,3) << std::endl;
std::cout << f3(6,2) << std::endl;

例子:假设某些处理的,参数永远是2个int,返回值永远是int,想把这些处理放到一个函数表里,比如方到std::map里。

#include <functional>
#include <map>
#include <iostream> int add(int a, int b){
return a+ b;
}
auto mod = [](int a, int b){return a % b;};
struct divide{
int operator()(int a, int b){
return a / b;
}
}; int main(){
/*
std::map<std::string, int(*)(int, int)> mp;
mp.insert({"+", add});
mp.insert({"%", mod});
divide dv;
mp.insert({"/", divide()});//bian yi bu guo std::function<int(int, int)> f1 = add;
std::function<int(int, int)> f2 = mod;
std::function<int(int, int)> f3 = divide();
std::cout << f1(1,2) << std::endl;
std::cout << f2(4,3) << std::endl;
std::cout << f3(6,2) << std::endl;
*/ std::map<std::string, std::function<int(int, int)>> mp;
mp.insert({"+", add});
mp.insert({"-", std::minus<int>()});
mp.insert({"*", [](int a, int b){return a * b;}});
mp.insert({"%", mod});
mp.insert({"/", divide()}); std::cout << mp["+"](1, 2) << std::endl;
std::cout << mp["-"](3, 2) << std::endl;
std::cout << mp["*"](2, 2) << std::endl;
std::cout << mp["/"](100, 2) << std::endl;
std::cout << mp["%"](31, 15) << std::endl;
}

github

有个麻烦的情况,例如有2个名字都叫add的方法。


int add(int a, int b){
return a+ b;
} double add(double a, double b){ return a + b;} mp.insert({"+", add});

当mp.insert({"+", add});的时候,编译器无法通过名字确定是哪个方法,怎么办???

使用函数指针消除二义性。

  int(*add1)(int, int) = add;
double(*add2)(double, double) = add;
mp.insert({"+1", add1});
mp.insert({"+2", add2});

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 重载运算符 标准库function的用法的更多相关文章

  1. 标准库function类型的使用

    14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> ...

  2. 标准库string的用法探讨

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  3. C++标准库:bitset 用法整理&&zoj 3812

    转载: http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/ 头文件:#include <bits/st ...

  4. C++ Pirmer : 第十四章 : 重载运算符与类型转换之函数调用运算符与标准库的定义的函数对象

    函数调用运算符 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所谓的函数调用就是一个类重 ...

  5. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  6. Chapter14:重载运算符

    对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数. int operator+(int, int);//错误,不能为int重定义内置运算符 对于一个重载的运算符来说,其优先级和结 ...

  7. [C++ Primer] : 第14章: 重载运算符与类型转换

    基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...

  8. 【C++】C++中重载运算符和类型转换

    输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...

  9. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

随机推荐

  1. H5本地存储sessionStorage和localStorage的区别

    sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...

  2. C++实现多级排序

    stl中sort详细说明 实现功能:期末开始4位同学的成绩,按多级排序,排序规则为:按数学从小到大,如果数学相等,则按语文从大到小排列,如果语文相等,则按英语从小到大排列,如果英语相等,则按历史从大到 ...

  3. Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取

    写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都 ...

  4. 漫画:SOA中怎样确定服务的粒度?

    一般系统的服务划分有以下两种维度: 按模块划分 这个比较适用于偏业务的场景:复杂的系统,最好先按业务领域横向拆分成可独立部署的子系统,每个子系统内部再按技术纵向拆分成不同的子模块. 按角色划分 这个比 ...

  5. Asp.Net SignalR - 准备工作

    实时通讯 在做Web的时候经常会有客户端和服务端实时通讯的需求,比如即时聊天等.目前实时通讯有很多种规范和实现方式,但是每一个对浏览器的兼容性或者性能都不是很完美. 目前主流的解决方案有 WebSoc ...

  6. Java类文件的结构

    Class文件是以8位字节为基础单位的二进制流,各部分中间没有分隔符.遇到8位字节以上的空间数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储. Class文件采用类似C语言的伪结构体来存储 ...

  7. C#7.0新特性

    前言 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下其实2016年12月就已经公布了的C#7 ...

  8. leetcode — maximum-depth-of-binary-tree

    /** * * Source : https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ * * * * Given a bina ...

  9. Azkaban学习之路 (三)Azkaban的使用

    界面介绍 首页有四个菜单 projects:最重要的部分,创建一个工程,所有flows将在工程中运行. scheduling:显示定时任务 executing:显示当前运行的任务 history:显示 ...

  10. Thread之九:stop

    搞过Java线程的人都知道,stop这个方法是臭名昭著了,早就被弃用了,但是现在任然有很多钟情与他的人,永远都放不下他,因为从他的字面意思上我们可以知道他貌似可以停止一个线程,这个需求是每个搞线程开发 ...