10.9.2 std::function 非OO的多态实现 Page185~187

源代码:

#include <iostream>
#include <functional>
#include <list>

using namespace std;

//使用function模板类定义一个类型,
//该类型要求作为T的
//函数类型是参数是string,返回值是void
typedef std::function <void (std::string)>
                            IntroductionFunction;

struct Person
{
    //参数是一个IntroductionFunction类型的对象引用
    Person(IntroductionFunction& f)
        : _introduction(f)
    {
    }

    void Introduction(std::string const& name) const
    {
        this->_introduction(name);
    }

private:
    //成员是一个IntroductionFunction类型的对象
    IntroductionFunction _introduction;
};

//普通人的介绍
//函数类型是参数是string,返回值是void,
//可用来构造IntroductionFunction类型的对象
void NormalIntroduction(std::string const& name)
{
    cout << "我是:" << name << endl;
}

//美女的介绍
//参数是string,返回值是void,
//可用来构造IntroductionFunction类型的对象
void BeautyIntroduction(std::string const& name)
{
    cout << "我是大美女:" << name << endl;
}

///超级大美女的介绍
struct SuperBeautyIntroduction
{
    SuperBeautyIntroduction()
        : _count(0)
    {

    }
    //重载(),参数是string,这样SuperBeautyIntroduction的对象
    //可以作为函数对象使用,函数类型是void (std::string),
    //所以SuperBeautyIntroduction的对象也可以用来构造
    //IntroductionFunction对象
    void operator () (std::string const& name)
    {
        if(_count < 1)
        {
            BeautyIntroduction(name);
        }
        else
        {
            cout << "你们这些媒体烦不烦嘛,我这都第"
                 << _count + 1 << "次自我介绍了!" << endl;
        }

        ++ _count;
    }
private:
    int _count;//介绍次数
};

void test()
{
    /* IntroductionFunction是std::function <void (std::string)>类型,
    NormalIntroduction是void (std::string)类型的函数
    所以n_introduce实际上是以NormalIntroduction为参数构造出来的一个对象*/

    //以普通人自我介绍的方式构造一个对象
    //使用NormalIntroduction作为参数构造一个IntroductionFunction对象n_introduce
    IntroductionFunction n_introduce(NormalIntroduction);
    //使用对象n_introduce构造一个Person对象
    Person p1(n_introduce); ///构造一个普通人对象
    p1.Introduction("李师师"); ///普通人开始介绍自己
    p1.Introduction("李师师");
    //使用BeautyIntroduction作为参数构造一个IntroductionFunction对象b_introduce
    IntroductionFunction b_introduce(BeautyIntroduction);
    Person p2(b_introduce); ///构造一个美女对象
    p2.Introduction("王熙凤");
    p2.Introduction("王熙凤");
    //sb是个函数对象,函数类型是void (std::string)
    SuperBeautyIntroduction sb; ///一个超级大美女对象
    IntroductionFunction sb_introduce(sb); ///sb是个函数对象
    Person p3(sb_introduce);
    p3.Introduction("凤姐");
    p3.Introduction("凤姐");

}
void demo_polymorphism_without_virtual()
{
    //list的元素类型是pair <Person, string>
    std::list <std::pair <Person, std::string>> lst;
    /**< IntroductionFunction的参数是string类型,返回值是void类型 */
    /**< IntroductionFunction是Person类的一个成员 */
    //n_introduce是个IntroductionFunction类型的函数
    /**< 相当于IntroductionFunction n_introduce = NormalIntroduction */
    IntroductionFunction n_introduce(NormalIntroduction);
    /**< 相当于IntroductionFunction b_introduce = BeautyIntroduction; */
    IntroductionFunction b_introduce(BeautyIntroduction);

    SuperBeautyIntroduction sb;  //一个超级大美女对象
    IntroductionFunction sb_introduce(sb); ///这里不用ref, 这里的sb是函数对象sb()
    /**< 将Person和名字绑定到一起构成一个pair,然后存储到lst里面 */
    lst.push_back(std::make_pair(Person(n_introduce), "玫露"));
    lst.push_back(std::make_pair(Person(n_introduce), "梦露"));
    lst.push_back(std::make_pair(Person(sb_introduce), "露露"));

    for(auto it = lst.begin(); it != lst.end(); ++ it)
    {
        //每人自我介绍两次:
        it->first.Introduction(it->second);
        it->first.Introduction(it->second);
    }
}

int main()
{
    test();
    cout << "----------" << endl;
    demo_polymorphism_without_virtual();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全链路压测方案(一)—方案调研

一、概述 在业务系统中&#xff0c;保证系统稳定至关重要&#xff0c;直接影响线上业务稳定和性能。测试工作作为保证生产质量的最后一关&#xff0c;扮演者重要的角色。全链路压测是一种重要的测试工具和手段。可以解决系统中多环节多节点无法全流程打满流量的痛点问题&a…

Ubuntu 22.04 Cron使用

需要定时处理的场景还是比较多的&#xff0c;比如信息推送、日志清理等。 这篇文章我们来说说如何使用cron来实现定时处理&#xff0c;以及监控任务的执行。 使用 Ubuntu中使用cron&#xff0c;要用到的命令是crontab。不加sudo时&#xff0c;处理的是个人的定时任务。当加上…

pytorch集智4-情绪分类器

1 目标 从中文文本中识别出句子里的情绪。和上一章节单车预测回归问题相比&#xff0c;这个问题是分类问题&#xff0c;不是回归问题 2 神经网络分类器 2.1 如何用神经网络分类 第二章节用torch.nn.Sequantial做的回归预测器&#xff0c;输出神经元只有一个。分类器和其区别…

计算机网络期末复习(基础概念+三套卷子练习)

第一章&#xff1a;计算机网络概念 计算机网络的概念 计算机网络的定义 计算机网络是指将地理位置不同的 具有独立功能的多台计算机 及其外部设备&#xff0c;通过 通信线路链接 起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64&#xff0c;下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init&#xff0c;初始化当前目录成为git仓库…

精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略

不多说&#xff0c;直接上效果如图&#xff1a; ► 日线表现 代码评估 技术指标代码评估&#xff1a; VAR1, VAR2, VAR3&#xff1a;这些变量是通过指数移动平均&#xff08;EMA&#xff09;计算得出的。EMA是一种常用的技术分析工具&#xff0c;用于平滑价格数据并减少市场“…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

操作系统复习篇

目录 一、引论 1.1、操作系统的目标 方便性&#xff1a; 有效性&#xff1a; 可扩充性&#xff1a; 开放性&#xff1a; 1.2、操作系统的作用 用户与计算机硬件系统之间的接口&#xff1a; 计算机系统资源的管理者&#xff1a; 实现对计算机资源的抽象&#xff1a; 1…

SqlAlchemy使用教程(二) 入门示例及编程步骤

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解 二、入门示例与基本编程步骤 在第一章中提到&#xff0c;Sqlalchemy提供了两套方法来访问数据库&#xff0c;由于Sqlalchemy 官方文档结构有些乱&#xff0c;对于ORM的使用步骤的描…

使用scipy处理图片——旋转任意角度

大纲 载入图片左旋转30度&#xff0c;且重新调整图片大小右旋转30度&#xff0c;且重新调整图片大小左旋转135度&#xff0c;保持图片大小不变右旋转135度&#xff0c;保持图片大小不变 在《使用numpy处理图片——90度旋转》中&#xff0c;我们使用numpy提供的方法&#xff0c;…

庆祝一年的成长

本文字数&#xff1a;2288&#xff1b;估计阅读时间&#xff1a;6 分钟 作者&#xff1a;ClickHouse Team 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 随着今年即将结束&#xff0c;我们想要向您表达衷心的感谢&#xff0c;感谢您…

实现STM32烧写程序-(3) Hex文件结构

简介 要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。 资料 Hex文件 简介 Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后&#xff0c;Hex…

XCTF:Hidden-Message[WriteUP]

使用Wireshark打开文件 分析能分析的流&#xff0c;这里直接选择UDP流 分别有两段流&#xff0c;内容都是关于物理的 和flag没啥关系&#xff0c;只能从别的方面下手 分析&#xff1a;整个数据包&#xff0c;全部由UDP协议组成 其中发送IP和接收IP固定不变&#xff0c;数据长…

Leetcode3002. 移除后集合的最多元素数

Every day a Leetcode 题目来源&#xff1a;3002. 移除后集合的最多元素数 解法1&#xff1a;贪心 可以将数组去重后分为三个部分&#xff1a;nums1 独有的&#xff0c;nums2 独有的&#xff0c;nums1 与 nums2 共有的。 求集合 S 时&#xff1a; 先选择两个数组独有的。…

【软件测试】学习笔记-性能测试的基本方法与应用领域

这篇文章探讨并发用户数、响应时间和系统吞吐量这三个指标之间的关系和约束&#xff0c;性能测试七种常用方法&#xff0c;以及四大应用领域。 由于性能测试是一个很宽泛的话题&#xff0c;所以不同的人对性能测试的看法也不完全一样&#xff0c;同样一种方法可能也会有不同的…

第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘

文章目录 一、按键原理二、独立键盘&矩阵键盘2.1 独立按键2.2 矩阵键盘 一、按键原理 原理很简单&#xff0c;当我们没有按下SW2时&#xff0c;由于上拉电阻得作用&#xff0c;使得输入引脚得信号为高电平&#xff0c;当按下按键后&#xff0c;引脚直接接地&#xff0c;输入…

MySQL面试题 | 08.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

List集合遍历过程中修改元素(有坑)

说来惭愧&#xff0c;学 java 2年了&#xff0c;对 “Java是值传递” 这句话还没有理解它的精髓&#xff0c;以至于编程的时候出现了一些错误&#xff0c;这里记录一下。 一.问题再现 1.1将List集合中的每个字符串更改为其他值 1.2将List集合中的对象更改为其他对象 二.问题分…

【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

问题背景&#xff1a; 最近在使用海豚调度DolphinScheduler的Datax组件时&#xff0c;遇到这么一个问题&#xff1a;之前给客户使用海豚做的离线数仓的分层搭建&#xff0c;一直都运行好好的&#xff0c;过了个元旦&#xff0c;这几天突然在数仓做任务时报错&#xff0c;具体报…

【Rust日报】2024-01-12 将 Rust 引入 Git 项目

将 Rust 引入 Git 项目 去年年底的假期里&#xff0c;Taylor Blau 花了一些时间思考如何将 Rust 引入 Git 项目。 将 Rust 引入 Linux 内核的重要工作正在进行中。在他们既定的目标中&#xff0c;他认为有一些可能与 Git 项目相关&#xff1a; 由于语言的安全保证&#xff0c;内…