亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

夏邑县| 建宁县| 历史| 青龙| 平塘县| 大竹县| 衡阳市| 茂名市| 望奎县| 定西市| 台安县| 成武县| 伊通| 虎林市| 綦江县| 河曲县| 威远县| 怀安县| 浦东新区| 宁津县| 宜城市| 浦县| 夹江县| 四川省| 陆川县| 南安市| 仙居县| 武安市| 民丰县| 南乐县| 海伦市| 和政县| 全南县| 汉沽区| 汨罗市| 肥东县| 水城县| 阿尔山市| 古蔺县| 泗阳县| 宁阳县|