如何解决C++访问者模式模板函数无法重载的问题
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"如何解决C++访问者模式模板函数无法重载的问题",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何解决C++访问者模式模板函数无法重载的问
千家信息网最后更新 2026年11月01日如何解决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安全错误
数据库的锁怎样保障安全
互联网科技
华服互联网科技怎么样
新华互联网科技学校
深圳恒合互联网络科技有限公司
重庆互联网络科技
互联网金融与金融科技
万易互联网科技有限公司
碳银互联网科技
互联网科技排名
百单互联网科技有限公司
互联网 新科技
互联网科技宣传片
互联网科技股有哪些
滨湖区互联网智能科技产品供应
江苏南京365互联网科技
天速互联网络科技有限公司
昭通互联网科技选哪家
恒生互联网科技业指数调整周期
北京军民互联网科技公司
深圳互联网科技园地址
互联网金融科技
亿人帮互联网科技有限公司
科技赋能下的互联网金融
合肥互联网科技公司
互联网科技革命
联恩商钥互联网科技有限公司
字节跳动和互联网科技
青岛科技大学互联网大赛研究生
浙南科技城互联网大厦建设工程
徐州市互联网科技有限公司