您好,登錄后才能下訂單哦!
今天小編給大家分享一下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...) // 返回處理結果 ... }
對于這種通用的增強邏輯及包裝形式,很適合用模板作為統一實現,簡化代碼邏輯,并增強后期維護,對于上述場景,有如下兩種模板實現方式:
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...); }
觀察上一種實現方案,發現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++類函數作為模板參數實現的方法是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。