首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ Veneers 模式:模板化繼承與泛型繼承的輕量擴展術

     編輯:關於C語言

什麼是 Veneer?

Veneer(飾面)是一種類別模板,滿足四大特徵:

  1. 公開繼承自模板參數 T
  2. 不宣告虛擬函式
  3. 無非靜態成員變數、無虛擬解構函式
  4. 不增加物件大小與記憶體存取頻率(零開銷抽象)

核心動機

向嚴密的繼承體系注入新功能而不修改原始碼、不引入虛擬函式表開銷。ATL CWindow 缺少 GetDlgItemTextLength,即可用 Veneer 擴展:

template <typename T>
class parent_window_veneer : public T {
public:
    using ParentClass = T;
    using Class = parent_window_veneer<T>;

    int GetDlgItemTextLength(UINT id) {
        return ::GetWindowTextLength(GetDlgItem(id));
    }
};

使用方式

// 原本
CWindow wnd;

// 擴展後
parent_window_veneer<CWindow> wnd;
wnd.GetDlgItemTextLength(IDC_EDIT1); // 直接可用

同一 Veneer 可套用至 CContainedWindow 等任何含相容 GetDlgItem 的類別,只需修改 typedef。

進階特性

  • 可加入解構函式:但若 T 非多態型別(無虛擬解構函式),嚴禁多態刪除
  • 陣列相容:Veneer 與 T 大小相同,可直接用於陣列,避免異構陣列問題
  • RAII 資源管理:STLSoft 的 sequence_container_veneer 為標準容器加入自動清理

STLSoft 實例

  • pod_veneer
  • conversion_veneer
  • associative_container_veneer

優勢總結

  1. 零代碼重複注入功能
  2. 零執行期開銷(大小、速度)
  3. 支援陣列與值語意
  4. 編譯期類型安全

來源:https://synesis.com.au/resources/articles/cpp/veneers.pdf | 譯者:ume

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved