博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类型擦除
阅读量:4297 次
发布时间:2019-05-27

本文共 2260 字,大约阅读时间需要 7 分钟。

借助基类指针调用虚接口的方式,即多态,可以实现业务层仅感知到基础类型及接口定义,分发执行子类对象覆写实现的效果。但对于非同一继承层次内的类型,接口调用则只能通过针对每个类型定义适配类的方式来实现,但每增一个子类都要有新增适配类,则会导致类数量的膨胀。而模板更能适配这类场景。

#include 
#include
#include
class IAnimal { public: IAnimal() {} virtual ~IAnimal() {} virtual void makeSound() const = 0;};class Dog : public IAnimal { public: Dog() {} virtual ~Dog() override {} virtual void makeSound() const override { std::cout << "woof" << std::endl; } std::string toString() const { return "Dog"; }};class Cat : public IAnimal { public: Cat() {} virtual ~Cat() override {} virtual void makeSound() const override { std::cout << "meow" << std::endl; } std::string toString() const { return "Cat"; }};class Robot { public: std::string toString() const { return "Robot"; }};using namespace std;// 业务与非模板类型 HolderBase有关联依赖,HolderBase中不体现类型形参class ThingWithToString {public: template
ThingWithToString(const T& obj) : inner_(std::make_unique
>(obj)) { } ThingWithToString(const ThingWithToString& that) : inner_(that.inner_->clone()) { } ThingWithToString& operator=(const ThingWithToString& that) { if (this != &that) { inner_ = that.inner_->clone(); } return *this; } std::string toString() const { return inner_->toString(); }private: struct HolderBase { virtual ~HolderBase() { } virtual std::string toString() const = 0; virtual std::unique_ptr
clone() const = 0; };// HolderBase的子类与类型形参直接关联,明确感知类型。同时实现父类的纯虚接口。 template
struct Holder : public HolderBase { Holder(const T& obj) : obj_(obj) { } std::string toString() const override { return obj_.toString(); } std::unique_ptr
clone() const override { return std::make_unique
>(obj_); } T obj_; }; std::unique_ptr
inner_;}; // Cat、Dog与Robot属不同类别,但都有一致的及接口约定(tostring),这是模板适用的前提。 ThingWithToString getThingWithToString(int which){ switch (which) { case 0: return ThingWithToString(Dog()); case 1: return ThingWithToString(Robot()); default: throw std::runtime_error("Unknown object type"); }} int main(){ int which = 1; std::cin >> which; ThingWithToString object = getThingWithToString(which); std::cout << object.toString() << std::endl; return 0;}

转载地址:http://rscws.baihongyu.com/

你可能感兴趣的文章
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day05
查看>>
学习笔记_vnpy实战培训day06
查看>>
聚合搜索引擎
查看>>
Python super钻石继承
查看>>