了解隐式接口和编译期多态——条款41

OCR模型轻量化新思路:用ONNX Runtime加速PP-OCRv4推理(附性能对比测试) 本文详细介绍了如何利用ONNX Runtime对PP-OCRv4模型进行轻量化部署与推理加速。通过模型导出优化、动态量化、线程绑定及内存复用等技巧,在树莓派、RK3588等边缘设备上实现了超过50%的性能提升,并显著降低了内存占用,为移动端OCR部署提供了完整的优化方案和实测数据对比。 阅读详情

        面向对象变成世界总是以显式接口(explicit interfaces)和运行期多态(runtime polymorphism)解决问题。举个例子,给定这样(无甚意义)的class:

class Widget {
public:
    Widget();
    virtual ~Widget();
    virtual std::size_t size() const;
    virtual void normalize();
    void swap(Widget& other);           // 见条款25
    ...
};

和这样(也是无甚意义)的函数:

void doProcessing(Widget& w)
{
    if (w.size() > 10 && w != someNastyWidget) {
        Widget temp(w);
        temp.normalize();
        temp.swap(w);
    }
}

        我们可以这样说doProcessing内的w:

  • 由于w的类型被声明为Widget,所以w必须支持Widget接口。我们可以在源码中找出这个接口(例如在Widget的.h文件中),看看它是什么样子,所以我称此为一个显式接口(explicit interface),也就是它在源码中明确可见。
  • 由于Widget的某些成员函数是virtual,w对那些函数的调用将表现出运行期多态(runtime polymorphism),也就是说将于运行期根据w的动态类型(见条款37)决定究竟调用哪一个函数。

        Templates及泛型编程的世界,与面向对象有根本上的不同。在此世界中显式接口和运行期多态仍然存在,但重要性降低。反倒是隐式接口(implicit interfaces)和编译期多态(compile-time polymorphism)移到前头了。若想知道那是什么,看看当我们将doProcessing从函数转变成函数模板(function template)时发生什么事:

template<typename T>
void doProcessing(T& w)
{
    if (w.size() > 10 && w != someNastyWidget) {
        T temp(w);
        temp.normalize();
        temp.swap(w);
    }
}

        现在我们怎么说doProcessing内的w呢?

  • w必须支持哪一种接口,系由template中执行于w身上的操作来决定。本例看来w的类型T好像必须支持size,normalize和swap成员函数、copy构造函数(用来建立temp)、不等比较。我们很快会看到这并非完全正确,但对目前而言足够真实。重要的是,这一组表达式(对此template而言必须有效编译)便是T必须支持的一组隐式接口(implicit interface)。
  • 凡涉及w的任何函数调用,例如operator>和operator!=,有可能造成template具现化(instantiated),使这些调用得以成功。这样的具现行为发生在编译器。“以不同的template参数具现化function templates”会导致调用不同的函数,这便是所谓的编译器多态。

        纵使你从未用过templates,应该不陌生“运行期多态”和“编译期多态”之间的差异,因为他类似于“哪一个重载函数该被调用”(发生在编译器)和“哪一个virtual函数该被绑定”(发生在运行期)之间的差异。显式接口和隐式接口的差异就比较新颖,需要更多更贴近的说明和解释。

        通常显式接口由函数的签名式(也就是函数名称、参数类型、返回类型)构成。例如Widget class:

class Widget {
public:
    Widget();
    virtual ~Widget();
    virtual std::size_t size() const;
    virtual void normalize();
    void swap(Widget& other);
};

        其public接口由一个构造函数、一个析构函数、函数size,normalize,swap及其参数类型、返回类型、常量性构成。当然也包括编译器产生的copy构造函数和copy assignment操作符(见条款5)。

        隐式接口就完全不同了。它并不基于函数签名式,而是由有效表达式组成。再次看看doProcessing template一开始的条件:

template<typename T>
void doProcessing(T& w)
{
    if (w.size() > 10 && w != someNastyWidget) {
     ...

        T(w的类型)的隐式接口看来好像有这些约束:

  • 它必须提供一个名为size的成员函数,该函数返回一个整数值。
  • 它必须支持一个Opera!=函数,用来比较两个T对象。这里我们假设someNastyWidget的类型为T。

        加诸于template参数身上的隐式接口,就像加诸于class对象身上的显式接口一样真实,而且两者都在编译期完成检查。就像你无法以一种“与class提供之显式接口矛盾”的方式来使用对象(代码将通不过编译),你也无法在template中使用“不支持template所要求之隐式接口”的对象(代码一样通不过编译)。

请记住

  • classes和templates都支持接口和多态
  • 对classes而言接口是显式的(explicit),以函数签名为中心。多态则是通过virtual函数发生于运行期。
  • 对template参数而言,接口是隐式的(implicit),奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。
无线通信技术及其在机器人中的应用 本文系统阐述了无线通信技术在机器人领域的应用框架与技术选型。首先构建了无线通信的三层理论架构:物理层解决信号传输问题,链路层处理接入控制,网络层实现组网管理。随后详细分析了主流无线技术的特性与适用场景:BLE适用于低功耗传感器节点,Wi-Fi适合高带宽视频传输,5G专网满足工业AGV的广域覆盖需求,星闪技术凭借20μs超低时延和4096台并发连接能力,为高端机器人应用提供突破性解决方案。通过鄂尔多斯隆基5G专网等典型案例,验证了5G在工业AGV规模化部署中的优势,并展望了通感算智融合、星闪+5G协同等未来发 阅读详情

相关推荐

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr

哈里·雪利博客 1万+

显示接口成员实现(explicit interface member implementation)总结

为了实现接口,类或结构可以声明显示接口成员实现(explicit interface member implementation),显示节后成员实现就是一种方法、属性、事件或索引器声明,它实用完全限定接口成员作为标识符。接口成员有时也用它的完全限定名(fully qualified name)来引用。成员的完全限定名将引用声明该成员的接口。接口成员限定名的组成是:声明该成员的接口名字.该成

zenolee的专栏 1082

从镜头到像素:深入解析Camera、Sensor与V4L2的协同工作流

本文深入解析了摄像头从物理成像到软件控制的完整工作流。详细介绍了镜头、传感器(Sensor)与V4L2框架的协同机制,涵盖光电转换、同步信号、ISP图像处理等核心环节,并通过实战演示了如何使用v4l2-ctl工具进行调试,为嵌入式开发和驱动调试提供系统指南。

weixin_29230805的博客 389

ylbtech-LanguageSamples-ExplicitInterface(显示接口)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-ExplicitInterface(显示接口)   1.A,示例(Sample) 返回顶部 显式接口 实现示例 本示例演示了如何显式地实现接口成员以及如何从接口实例访问这些成员。有关背景信息,请参见接口(C# 编程指南)...

weixin_33910434的博客 139

将运算放大器(运放)用作比较器

我们研究了一些经典的运算放大器电路。这些电路中运用了负反馈,因此通常就可以使运算放大器工作在线性区域内。 但是,也可以将运算放大器用作比较器,从而使其以非线性方式工作。由于其输入受到硬驱动,因此其输出电压会对电源轨产生猛烈的冲击。如下文所示,这可能并不总是一种好的设计方法。 变为非线性 在线性应用中,可以对运算放大器做如下理想假设:无限增益和带宽、零输出阻抗、无限输入阻抗,以及输入之间为零伏。也可以将运算放大器以非线性方式使用,但有一些地方要特别注意和处理。 一种常见的配置是仅使用开环运算放大器(无反馈),

ltqdxl的博客 3万+

什么是 SAPGUI 里的 Logon Group/Server

这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1069

Effective C++之 Item 41: 理解 implicit interfaces(隐式接口)和 compile-time polymorphism(编译期多态)

object-oriented programming(面向对象编程)的世界是围绕着 explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)为中心的。例如,给出下面这个(没有什么意义的)class(类), class Widget { public: Widget(); virtual ~Widget(); virtual st...

janeqi1987的专栏 528

几种负载均衡策略(DNS、NAT、重定向、反向代理)

摘要:本文对比了四种负载均衡技术:DNS负载均衡通过域名解析分发IP,用户直连服务器;NAT负载均衡通过VIP转发流量,所有流量经过负载均衡器;HTTP重定向通过302跳转实现分流;反向代理则隐藏后端服务器,统一转发请求。DNS简单但调度不精准,NAT精准但有带宽瓶颈,HTTP重定向延迟高,反向代理性能好但需专用设备。适用场景各异,DNS适合异地分流,NAT适合内网集群,HTTP重定向适合简单分流,反向代理适合高并发场景。核心区别在于层级(3层/7层)和流量走向(直连/中转)。

echo的博客 70

显示实现和隐式实现接口的区别(Implicit and Explicit Interface Implementations)

Implicit and Explicit Interface Implementations Rate This mhop 13 Dec 2006 2:59 AM 19 As I was putting together a post on IEnumerable andIEnumerator Iwas reminded of the subtleties of impl

jzt_designer的专栏 1499

基于深度学习的图像识别技术在农业领域中的应用

是识别"病害种类"还是"病害严重度分级"?前者是分类,后者常需分割或分级回归。是叶片级(离体叶片图像)、植株级(田间单株)、地块级(无人机俯拍)?视角不同,模型差异巨大。实时无人机巡检可能要求 < 50 ms/帧(Jetson Orin),而离线测报可接受秒级推理。类别标签、结构化 JSON、GIS 图斑、报警事件?

AI天才研究院 2160

Unreal5从入门到精通之如何在VR中使用3DUI

前面我们讲过《Unreal5从入门到精通之UMG的使用》一般制作游戏时,UI都是添加到屏幕视窗上面的,但是在制作VR时,我们往往需要制作一个3D的UI,放置在场景中,然后使用手柄的射线来和UI进行交互。今天我们就来讲解下,如何在VR中创作和交互3DUI首次操作会感觉好复杂,多多练习,当你熟悉了UE蓝图的操作后会发现,这只是一个常规的蓝图操作而已。祝大家在虚幻的学习过程中非常顺利。希望这篇博客对你有所帮助。

TxNet 1983

条款41:了解隐式接口和编译期多态

1、显式接口和运行期多态 (1)简介 面向对象编程总是以显式接口和运行期多态来解决问题。例如: class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); virtual swap(Wi...

江南又一春 319

ArXiv 2026 即插即用 | Transformer篇 | WeightFormer:告别二次复杂度!无注意力的线性时间 Transformer,泛化能力拉满

WeightFormer是一种创新的动态Transformer架构,其核心创新在于通过双动态算子(空间自适应动态卷积和双边激活动态线性)实现输入自适应的特征提取。该模块采用静态-动态权重融合机制和低秩预测技术,在仅增加5%参数量的情况下显著提升模型泛化能力。相比传统Transformer,WeightFormer在ImageNet-1K上提升2.3%精度,小样本任务提升12%,同时保持线性计算复杂度。模块可直接替换标准Transformer块,特别适合轻量级视觉任务,实现了精度与效率的平衡。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 128

Effective C++条款41:了解隐式接口和编译期多态

考虑以下函数模板: template<typename T> void doProcessing(T & w) { if(w.size()>10 && w != someNastyWidget) { T temp(w); temp.normalize(); temp.swap(w); } } 现在我们该怎么描述w呢? w必须支持哪一种接...

qq_44800780的博客 289

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Effective C++ 条款41:了解隐式接口和编译期多态

模板参数的接口是隐式的,只要模板实例化时所需的操作是可用的,代码就可以编译通过。通过运行期多态提供其实现。通过清晰的函数签名定义,,模板就能正常编译。

weixin_42255569的博客 653

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

条款41:了解隐式接口和编译期多态

List item

L_H_L的博客 240

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Effective C++ 学习笔记 条款41 了解隐式接口和编译期多态

这个 operator> 不必接受 X 类型的参数,因为它可以接受 Y 类型的参数,只要存在从 X 类型对象到 Y 类型对象的隐式转换,那也完全可以!即使你从未使用过模板,你也应该熟悉运行时多态和编译期多态之间的区别,因为它类似于“确定一组重载函数中该调用哪个”的过程(发生在编译期)与“虚函数调用的动态绑定”(发生在运行时)之间的区别。正如你不能以一种与类提供的显式接口相矛盾的方式使用对象一样(代码无法编译),你也不能试图在模板中使用一个对象,除非该对象支持模板所要求的隐式接口(同样,代码无法编译)。

tus00000的博客 186

《Effective C++》学习笔记(条款41:了解隐式接口和编译期多态)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 1 显式接口 和 运行期多态 面向对象编程的世界总是以显示接口和运行期多态解决问题。举个例子, class Widget { //给个无意义的类 public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize();

ZLX的博客 568

《Effective C++》读书笔记 条款41:了解隐式接口和编译期多态

在面向对象的编程中,总是以显式接口和运行期多态解决问题,而在Temlplate和泛型编程中,主要是隐式接口和编译期多态。 1.显式接口 由函数的声明构成(函数名称、参数类型、返回类型),如:int fun(int x);看到函数声明我们就知道函数名称,返回类型,参数类型,这种是显示接口。面向对象的编程在类中声明函数,就是显示接口,每当我们调用了类的函数,我们就可以通过类中的声明了解到这个函数的...

junya_zhang的博客 294

Effective C++条款41:模板与泛型编程之(了解隐式接口和编译期多态)

待续

董哥的黑板报 880

Effective C++条款41:模板与泛型编程——了解隐式接口和编译期多态

一、面向对象编程中提供的是“显式接口”和“运行期多态” 概述:面向对象编程世界总是以“显式接口”和“运行期多态”解决问题 演示说明 下面定义一个类,用作演示: class Widget { public: Widget(); virtual ~Widget(); virtual std::size_t size()const; virtual void normalize(); void swap(Widget& other);

www_dong的博客 222

条款41:了解隐式接口以及编译期多态

相对于继承体系来说,template实际上也使用接口与多态,而继承体系往往使用到的是显式接口以及运行期多态,而template实际上用的是隐式接口以及编译期多态。 隐式接口实际上就是类似下面这样的东西: 1 template <class T> 2 int myTypes(T & tmp) 3 { 4 tmp.size(); 5 ......

weixin_33744141的博客 92

Effective C++ 条款41 了解隐式接口和编译期多态

1. 面向对象编程通常以显式接口(类中的函数原型)和运行时多态(虚函数和RTTI)解决问题,但在Templates及泛型编程的世界,尽管显式接口和运行时多态仍然存在,但隐式接口和编译时多态的重要性却明显提升. 2.通常显式接口由函数签名式构成,而隐式借口并不基于函数声明式,而是有有效表达式组成. 所谓泛型编程中的隐式接口,指的是类型参数在函数模板或类模板中的成员函数内部所涉及的操作....

ddzai7557的博客 161

Effective C++:条款41:了解隐式接口和编译期多态

(一) 首先看下面的类以及函数: class Widget { public: Widget(); virtual ~Widget(); virtual size_t size() const; virtual void normalize(); virtual swap(Widget& other); }; void doProcessing(Widget& w) { if(w.

u010470972的专栏 780
上一篇: 明智而审慎地使用多重继承——条款40
下一篇: 了解typename的双重意义——条款42
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值