文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

c++类函数作为模板参数实现的方法是什么

2023-07-05 07:24

关注

今天小编给大家分享一下c++类函数作为模板参数实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

需求背景

DB操作有四种基本操作:Insert、Update、Delete和Query,每种操作需要进行功能增强(eg:支持重试、权限校验等),最粗暴的实现就是改动原有接口实现,在实现中加入增强逻辑,这种方式对代码侵入性过高,而且无法控制该逻辑是否需要,如果不需要的话又得重新修改代码实现。

可以用装饰者设计模式对原有接口做一层包装,然后在包装层里注入增强实现逻辑,伪码表现形式:

Status Insert(Args args...);Status Update(Args args...);Status Delete(Args args...);Status Query(Args args...);Status Wapper(...){    // 增强逻辑实现    ...    // 调用原有函数    Insert(Args args...)    // 返回处理结果    ...}

实现方式

对于这种通用的增强逻辑及包装形式,很适合用模板作为统一实现,简化代码逻辑,并增强后期维护,对于上述场景,有如下两种模板实现方式:

struct + operator

class DbWapper : public DbOperation{public:    // 继承方法    Status Insert(Args args...) override;    Status Update(Args args...) override;    Status Delete(Args args...) override;    Status Query(Args args...) override;private:    DbOperation *m_dbOperation;    template <typename Func, typename... Args>    Status Wapper(Func func, Args &&...args)    {        // 调用原有的函数逻辑        Status status = func(std::forward<Args>(args)...);        // 增强逻辑实现        ...        return status;    }}Status Insert(Args args...) {    // 利用struct + operator实现函数包装    struct InsertFunc {        DbOperation *dbOperation;        Status operator()(Args args...) const        {            // 调用原有逻辑            return dbOperation->Insert(args...);        }    } insertFunc{m_dbOperation};    // 将函数包装作为function传入增强逻辑    return Wapper(insertFunc, args...);}

Pass Function Signature

观察上一种实现方案,发现struct和operator只是为了构造一种函数参数,便于模板调用原有逻辑,所以我们可以尝试消除struct,让模板只接受具体的函数签名,就可以极大简化实现逻辑,具体实现如下:

class DbWapper : public DbOperation{public:    // 继承方法    Status Insert(Args args...) override;    Status Update(Args args...) override;    Status Delete(Args args...) override;    Status Query(Args args...) override;private:    DbOperation *m_dbOperation;    template <typename... Args0, typename... Args1>    Status Wapper(Status (DbOperation::*method)(Args0...), Args1 &&...args)    {        // 调用原有的函数逻辑        Status status = (m_dbOperation->*method)(std::forward<Args1>(args)...);        // 增强逻辑实现        ...        return status;    }}Status Insert(Args args...) {    // 传入具体的函数签名    return Wapper((Status(DbOperation::*)(Insert函数签名))(&DbOperation::Insert), args...);}

以上就是“c++类函数作为模板参数实现的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯