news 2026/7/23 13:41:45

C++——Function原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++——Function原理

众所周知,function可以封装任意类型的可调用对象,功能十分强大,这篇文章主要是想讲解一下function的工作原理。

可调用对象有这么几种类型:仿函数对象、函数指针、lambda表达式... ... 即使这几种可调用对象的参数和返回值类型相同也会被会被判定为不同的类型,毕竟仿函数本质上是类,而函数指针是一个函数指针类型。我们首先要解决的问题就是如何接收不同的类型,答案是模板:

class function { public: template<class T> function(T t) { _t = t; } }

那么问题又来了,function类不知道T这个类型,如何提前定义一个对象(_t)去存储传参进来的可调用对象呢?答案是基类和子类:

class function { public: class Base { public: //虚析构函数保证能够正确调用child1的析构函数,否则调用的是Base的析构函数 virtual ~Base() = default; virtual void revoke() = 0; }; template<class T> class child1 : public Base { T _t; public: child1(T t) : _t(t) {} void revoke() override {_t();} }; template<class T> function(T t) { _base = new child1<T>(t); } ~function() { delete _base; } private: //无论可调用对象是什么类型它永远是Base的子类 Base* _base; };

为了包装器可以像函数一样被调用,我们再重载一个():

class function { public: class Base { public: //虚析构函数保证能够正确调用child1的析构函数,否则调用的是Base的析构函数 virtual ~Base() = default; virtual void revoke() = 0; }; template<class T> class child1 : public Base { T _t; public: child1(T t) : _t(t) {} void revoke() override {_t();} }; template<class T> function(T t) { _base = new child1<T>(t); } ~function() { delete _base; } void operator()() { _base->revoke(); } private: Base* _base; };

到这儿,整个包装器的原理大致就结束了,不过我们可以发现,现在的包装器只能接受无参并且无返回值的可调用对象。这就是为什么定义包装器的时候要传模版类型:

//不能主模板中偏特化,所以先声明主模板 template<class Ret,class... Args> class function; template<class Ret,class... Args> class function<Ret(Args...)>//这是一种偏特化,定义了传模板类型的格式 { public: class Base { public: //虚析构函数保证能够正确调用child1的析构函数,否则调用的是Base的析构函数 virtual ~Base() = default; virtual Ret revoke(Args...) = 0; }; template<class T> class child1 : public Base { T _t; public: child1(T t) : _t(t) {} Ret revoke(Args... args) override {_return _t(args...);} }; template<class T> function(T t) { _base = new child1<T>(t); } ~function() { delete _base; } Ret operator()(Args... args) { return _base->revoke(args...); } private: Base* _base; };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 13:40:10

解决千问text-embedding-v4与GraphRAG的兼容性问题

1. 项目背景与问题定位 上周在部署金融知识图谱问答系统时&#xff0c;遇到了千问text-embedding-v4模型与GraphRAG整合的兼容性问题。具体表现为&#xff1a;当GraphRAG尝试调用text-embedding-v4生成知识节点向量时&#xff0c;系统抛出"Embedding dimension mismatch&q…

作者头像 李华
网站建设 2026/7/23 13:39:25

SolidWorks装配体配合关系管理与清理技巧

1. SolidWorks配合关系管理基础 在三维建模软件SolidWorks中&#xff0c;配合关系&#xff08;Mate&#xff09;是装配体设计的核心要素之一。它定义了零部件之间的几何约束关系&#xff0c;比如同心、重合、平行等。配合关系存储在FeatureManager设计树的"配合"文件…

作者头像 李华
网站建设 2026/7/23 13:35:06

智慧机场全域动态孪生智能管控系统

智慧机场全域动态孪生智能管控系统一、方案概述为全面落实民航智慧机场建设规范、安全运行提升标准、信创国产化落地要求&#xff0c;针对当前机场传统监控体系分散、二维视角局限、静态模型滞后、盲区隐患较多、智能预警不足、底层架构不自主等行业痛点&#xff0c;本项目以行…

作者头像 李华
网站建设 2026/7/23 13:31:53

认知蒸馏技术:将人类思维转化为AI技能模块

1. 项目背景与核心概念"把自己蒸馏成Skill"这个看似科幻的概念&#xff0c;实际上是一种前沿的认知提取技术。它的核心思想是将一个人的思维方式、决策模式和知识体系转化为可执行的AI技能模块。这种技术源于知识蒸馏&#xff08;Knowledge Distillation&#xff09;…

作者头像 李华
网站建设 2026/7/23 13:31:47

123、OIS光学防抖:陀螺仪标定、音圈马达控制与滚珠式vs悬丝式的机械特性对比

123、OIS光学防抖:陀螺仪标定、音圈马达控制与滚珠式vs悬丝式的机械特性对比 去年在调试某旗舰机型的OIS时,遇到一个让人抓狂的问题:预览画面在低频抖动下防抖效果很好,但一旦用户走路或者坐车,画面边缘就开始出现诡异的“呼吸效应”——像是有只无形的手在反复拉扯画面。…

作者头像 李华
网站建设 2026/7/23 13:31:17

免费又高性能!Cloudflare 临时邮箱助力零成本搭建邮件服务

【导语&#xff1a;Cloudflare 推出临时邮箱服务&#xff0c;可免费搭建临时邮件服务。该服务具备高性能、现代化界面等特点&#xff0c;还拥有丰富的核心功能和独特的技术架构&#xff0c;为用户带来全新体验。】免费高性能&#xff1a;零成本打造邮件服务Cloudflare 临时邮箱…

作者头像 李华