91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++類函數作為模板參數實現的方法是什么

發布時間:2023-03-01 16:56:29 來源:億速云 閱讀:209 作者:iii 欄目:開發技術

今天小編給大家分享一下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++類函數作為模板參數實現的方法是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

延长县| 上蔡县| 福州市| 裕民县| 远安县| 宽城| 庆阳市| 介休市| 汉沽区| 辽宁省| 容城县| 中江县| 桐柏县| 同仁县| 沂源县| 本溪| 建宁县| 长武县| 武宣县| 格尔木市| 万载县| 九寨沟县| 沧州市| 友谊县| 炎陵县| 梧州市| 定安县| 西青区| 桓仁| 金秀| 盐亭县| 重庆市| 济源市| 信阳市| 民权县| 汕尾市| 大冶市| 隆化县| 措勤县| 台山市| 当涂县|