当前位置: 首页 > news >正文

网站建站发布平台怎么建个人网站

网站建站发布平台,怎么建个人网站,seo建站是什么意思,东坑仿做网站目录 一、核心原理 二、常见实现方式 1. 基于继承和虚函数(经典方式) 2. 基于 std::function(现代方式) 3. 基于模板和静态多态(编译时类型擦除) 三、应用场景 四、优缺点 优点: 缺点&…

目录

一、核心原理

二、常见实现方式

1. 基于继承和虚函数(经典方式)

2. 基于 std::function(现代方式)

3. 基于模板和静态多态(编译时类型擦除)

三、应用场景

四、优缺点

优点:

缺点:

五、标准库中的类型擦除示例

总结


C++ 类型擦除(Type Erasure)是一种编程技术,用于在保持运行时多态的同时隐藏具体类型信息,使代码更灵活、更通用。它通过封装类型特定的实现细节,将动态类型转换的负担从编译时转移到运行时。以下从原理、实现方式和应用场景三个方面详细介绍:

一、核心原理

类型擦除的本质是分离接口与实现

  1. 定义统一接口:通过抽象基类或函数对象定义公共行为。
  2. 封装具体实现:将不同类型的实现细节封装在内部,对外提供统一接口。
  3. 运行时多态:通过虚函数或函数指针在运行时动态调用具体实现。

与传统继承多态的区别:

  • 继承多态:依赖公共基类,客户端需知晓具体派生类。
  • 类型擦除:客户端仅与接口交互,完全 unaware 具体类型。

二、常见实现方式

1. 基于继承和虚函数(经典方式)

通过抽象基类定义接口,派生类实现具体逻辑,外部使用智能指针管理对象。

示例代码

#include <iostream> // 添加对头文件的包含
#include <memory>
#include <string>// 定义接口
class Shape {
public:virtual ~Shape() = default;virtual double area() const = 0;virtual std::string name() const = 0;
};// 具体实现类
class Circle : public Shape {
public:explicit Circle(double r) : radius(r) {}double area() const override { return 3.14 * radius * radius; }std::string name() const override { return "Circle"; }
private:double radius;
};class Rectangle : public Shape {
public:Rectangle(double w, double h) : width(w), height(h) {}double area() const override { return width * height; }std::string name() const override { return "Rectangle"; }
private:double width, height;
};// 类型擦除包装器
class AnyShape {
public:template<typename T>AnyShape(T shape) : self(std::make_unique<Model<T>>(std::move(shape))) {}double area() const { return self->area(); }std::string name() const { return self->name(); }private:struct Concept {virtual ~Concept() = default;virtual double area() const = 0;virtual std::string name() const = 0;};template<typename T>struct Model : Concept {explicit Model(T value) : data(std::move(value)) {}double area() const override { return data.area(); }std::string name() const override { return data.name(); }T data;};std::unique_ptr<Concept> self;
};// 使用示例
int main() {AnyShape s1 = Circle(5.0);AnyShape s2 = Rectangle(3.0, 4.0);// 客户端无需知道具体类型,统一调用接口std::cout << s1.name() << ": " << s1.area() << std::endl; // 输出 "Circle: 78.5"std::cout << s2.name() << ": " << s2.area() << std::endl; // 输出 "Rectangle: 12"
}

关键点

  • AnyShape 是类型擦除包装器,内部持有指向 Concept 接口的指针。
  • Model<T> 是具体实现的适配器,将任意符合接口的类型 T 转换为统一的 Concept
2. 基于 std::function(现代方式)

利用 std::function 内置的类型擦除能力,直接存储可调用对象。

示例代码

#include <functional>
#include <string>
#include <vector>class AnyShape {
public:template<typename T>AnyShape(T shape) : area_func([shape]() { return shape.area(); }),name_func([shape]() { return shape.name(); }) {}double area() const { return area_func(); }std::string name() const { return name_func(); }private:std::function<double()> area_func;std::function<std::string()> name_func;
};// 使用示例
struct Triangle {double base, height;double area() const { return 0.5 * base * height; }std::string name() const { return "Triangle"; }
};int main() {std::vector<AnyShape> shapes;shapes.push_back(Triangle{3.0, 4.0});shapes.push_back(Circle{5.0}); // 复用前面的Circle类for (const auto& shape : shapes) {std::cout << shape.name() << ": " << shape.area() << std::endl;}
}

关键点

  • std::function 可以存储任何可调用对象(函数、lambda、成员函数等)。
  • 通过 lambda 捕获具体对象,将其方法转换为无参数的可调用对象。
3. 基于模板和静态多态(编译时类型擦除)

使用模板在编译时实现类型擦除,避免运行时开销。

示例代码

template<typename Shape>
double calculate_area(const Shape& shape) {return shape.area(); // 静态多态:依赖Shape类型有area()方法
}// 使用示例
struct Square {double side;double area() const { return side * side; }
};int main() {Square s{5.0};std::cout << calculate_area(s) << std::endl; // 编译时确定类型
}

特点

  • 编译时多态,无虚函数调用开销。
  • 要求所有类型实现统一接口(鸭子类型)。

三、应用场景

  1. 泛型容器:存储不同类型但具有相同接口的对象。

  • 例如:std::vector<AnyShape> 可存储 Circle、Rectangle 等任意形状。
  1. 插件系统:动态加载不同实现,统一接口调用。

  • 例如:游戏引擎加载不同厂商的渲染插件。
  1. 回调函数封装:隐藏回调函数的具体类型。

  • 例如:GUI 框架的事件处理系统,存储不同类型的事件回调。
  1. 跨库接口:在不同库之间传递对象,避免暴露具体类型。

  • 例如:数据库驱动返回统一的 RecordSet 接口,隐藏底层实现。

四、优缺点

优点
  • 解耦接口与实现:客户端无需依赖具体类型,降低编译依赖。
  • 灵活性:可在运行时动态切换实现。
  • 代码复用:同一套逻辑处理多种类型。
缺点
  • 性能开销:虚函数调用或 std::function 的间接调用会降低性能。
  • 类型信息丢失:无法恢复原始类型(除非手动存储类型标签)。
  • 实现复杂度:需要设计额外的包装层,代码可读性可能降低。

五、标准库中的类型擦除示例

  • std::function:可存储任何可调用对象,擦除具体函数类型。
  • std::any:可存储任何类型的值,运行时查询类型。
  • std::vector<bool>:特殊实现,擦除了 bool 的真实类型(使用位压缩)。

总结

类型擦除是 C++ 中实现 “运行时泛型” 的强大技术,通过隐藏具体类型信息,提供统一接口,使代码更灵活、更具扩展性。选择合适的实现方式(继承、std::function 或模板)取决于具体场景的性能需求和类型安全要求。

http://www.shuangfujiaoyu.com/news/2877.html

相关文章:

  • 淘宝联盟怎样建设网站重庆关键词排名推广
  • 大型网站制作教程外链发布平台有哪些
  • 弹窗网站制作器互联网运营培训课程
  • 垫江网站建设百度平台app下载
  • 贩卖做网站资料seo网站建设公司
  • 武汉哪家做网站公司好北京百度竞价托管公司
  • 阿坝州做网站公司湖南seo推广服务
  • 做seo用什么网站系统现在网络推广方式
  • 招聘网站建设技术要求关键词竞价排名名词解释
  • 网站上用什么格式的图片百度电脑端网页版入口
  • dz网站建设器品牌营销策划案例
  • 网站页面可以用什么框架做免费b站推广网站不用下载
  • 源码哥网站的模板企点客服
  • 湛江哪家公司建网站最好seo免费入门教程
  • 免费自动刷访客量郑州seo网络推广
  • 搭建一个wordpress网站多钱长春seo主管
  • 新网站建设方案seo外链工具源码
  • 优惠券精选网站怎么做开发一个网站
  • 多层分销网站建设网站域名费一年多少钱
  • 建站经验 网站建设学院爱站网长尾关键词搜索
  • 网页版梦幻西游谛听怎么获得宁波网络推广优化方案
  • 成都网站开发建设优化网络的软件下载
  • 网站建设服务器软件厂房网络推广平台
  • 怎样建娱乐投注网站百度后台管理
  • 网站两边的悬浮框怎么做seo排名工具给您好的建议
  • wordpress 后台重定向优化关键词排名seo
  • 懂做网站的人就是好网络营销教案ppt
  • 秦皇岛网站建设百度竞价排名又叫什么
  • 网站建设估价一键优化是什么意思
  • 西安建设局网站首页谷歌浏览器官网下载