如何解决C++访问者模式模板函数无法重载的问题
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇内容主要讲解"如何解决C++访问者模式模板函数无法重载的问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何解决C++访问者模式模板函数无法重载的问
千家信息网最后更新 2025年11月07日如何解决C++访问者模式模板函数无法重载的问题背景
解决方案
最终代码
本篇内容主要讲解"如何解决C++访问者模式模板函数无法重载的问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何解决C++访问者模式模板函数无法重载的问题"吧!
背景
最近遇到一个比较棘手的场景,我们有一堆模块,他们有一个通用的基类,我们不防假设为 BaseClass,该类有一些通用的结构以及需要重载的方法。这些模块有一个堆同名但是不同类型
参数的方法,比如:
int DerivedClass1::DoNlpTask(const DerivedReq1& req, DerivedResp* resp);
类似这样的。每个 DerivedClass 的DoNlpTask都是同名不同参数的,而且这些要给业务去具体实现。正常来说,很容易想到函数重载的方式,但是很不幸,模板函数无法重载
但是,我们想让框架层和业务层相对解耦,不想让业务的具体类型等污染框架调度模块的结构。
解决方案
在这里,我们利用访问者模式的思想,结合C++的模板来统一处理。先定义一个Visitor,该类定义好具体业务模块的通用操作步骤;实现的时候利用模板特化来实例化不同的业务模块及其DoNlpTask 函数。这样在框架层只需要调用Visitor 的统一模板接口即可,具体参看一下代码。
最终代码
#include#include // 以下模拟请求协议 =====================class BaseReq {};class DerivedReq : public BaseReq {};class BaseResp {};class DerivedResp : public BaseResp {};DerivedReq g_derived_req;// 以下模拟 NLP ============================class BaseClass { public: // 单纯视为一个需要重载的函数 virtual int get_field_id() = 0; virtual void WormUp () {}};#define REGISTER_PROTOTYPE(req_type, resp_type) \ public: \ using ReqType = req_type; \ using RespType = resp_type;class DerivedClass : public BaseClass { // 注册请求类型 REGISTER_PROTOTYPE(DerivedReq, DerivedResp) public: int DoNlpTask(const DerivedReq&, DerivedResp* resp) { std::cout << "Derived DoNlpTask\n"; } int get_field_id() override { return 1; }};// 以下模拟pb反射 =========================const BaseReq* GetReqType() { return &g_derived_req; }// 以下是 visitor 的定义 ===========class Visitor { public: template int DoVisit(ClassType* base) { static_assert(std::is_base_of ::value, "type failed"); int idx = base->get_field_id(); std::cout << "visitor get field_id " << idx << std::endl; const auto* req = GetMessageType (GetReqType()); typename ClassType::RespType resp; // 返回计算结果 return base->DoNlpTask(*req, &resp); } private: template const ReqType* GetMessageType(const BaseReq* req) { static_assert(std::is_base_of ::value, "Message Type Error"); return static_cast (req); }};int main() { DerivedClass dc; Visitor vis; vis.DoVisit(&dc); return 0;}
到此,相信大家对"如何解决C++访问者模式模板函数无法重载的问题"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
函数
模板
业务
模块
模式
访问者
C++
问题
不同
方法
框架
类型
代码
内容
参数
结构
学习
统一
实用
更深
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
lol一个服务器多少人
pc搭建服务器
腾讯轻量服务器宝塔面板
数字货币量化软件开发
共享位置服务器不可用
传达网络安全工作会议精神
英业达b810服务器管理ip
服务器CT数据下载到本地
C 连接数据库取数据
软件开发风险评估有哪些
对计算机网络技术基础的建议
建立完善的师德诚信数据库亮点
软件开发 螺旋模型 案例
云服务器网站
期货交易所数据库接口
华师数据库设计
兴通科技互联网公司简介
数据库标志位的值
杭州双静网络技术服务
苏州戴尔t30服务器规格表
pe服务器刷钱
代理服务器 美国
东莞市中小学校园网络安全
连接数据库修改字符集
同花顺更新股票数据库
上级领导能查询下级数据库
宿舍数据库中应创建哪几个数据表
华三服务器做raid盘
上海网络技术应用研究所年薪
网络安全执法主体