c++ 类函数作为模板参数实现方式详解

 更新时间:2023年03月01日 10:12:22   作者:予耄逊于荒  
这篇文章主要介绍了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...);
}

Get busy living or get busy dying.

到此这篇关于c++ 类函数作为模板参数实现方式的文章就介绍到这了,更多相关c++ 类函数作为模板参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++高精度算法实现思路与代码

    C/C++高精度算法实现思路与代码

    高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家,下面这篇文章主要给大家介绍了关于C/C++高精度算法实现思路与代码的相关资料,需要的朋友可以参考下
    2023-11-11
  • C++ odr用法案例详解

    C++ odr用法案例详解

    这篇文章主要介绍了C++ odr用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++中vector与remove()函数详解

    C++中vector与remove()函数详解

    这篇文章主要介绍了C++中vector与remove()函数,本文实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Opencv 马赛克和毛玻璃效果与图片融合的实现

    Opencv 马赛克和毛玻璃效果与图片融合的实现

    这篇文章主要为大家详细介绍了通过OpenCV实现马赛克和毛玻璃滤镜效果与图片的融合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++归并算法实例

    C++归并算法实例

    这篇文章主要介绍了C++归并算法,实例分析了C++实现基于归并算法合并线性表的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C语言编写简单的定时关机程序

    C语言编写简单的定时关机程序

    本文给大家分享的是一则C语言编写的简单的定时关机程序,可以设置0-600秒倒计时,有需要的小伙伴可以参考下。
    2016-02-02
  • C语言中的线程信号控制详解

    C语言中的线程信号控制详解

    这篇文章主要通过一些示例为大家详细介绍一下C语言中的线程信号控制,文中的示例代码讲解详细,对我们深入了解C语言有一定的帮助,感兴趣的可以学习一下
    2023-02-02
  • C++ 智能指针深入解析

    C++ 智能指针深入解析

    以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • 解析C++中的5个存储类的作用

    解析C++中的5个存储类的作用

    这篇文章主要介绍了C++中的5个存储类的作用,存储类是管理对象的生存期、链接和内存位置的类型说明符,需要的朋友可以参考下
    2016-05-05
  • OpenCV 2.4.3 C++ 平滑处理分析

    OpenCV 2.4.3 C++ 平滑处理分析

    平滑也称模糊, 是一项简单且使用频率很高的图像处理方法,本文将详细介绍OpenCV 2.4+ C++ 平滑处理,需要了解更多的朋友可以详细参考下
    2012-11-11

最新评论