Veneer(飾面)是一種類別模板,滿足四大特徵:
T向嚴密的繼承體系注入新功能而不修改原始碼、不引入虛擬函式表開銷。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 非多態型別(無虛擬解構函式),嚴禁多態刪除T 大小相同,可直接用於陣列,避免異構陣列問題sequence_container_veneer 為標準容器加入自動清理pod_veneerconversion_veneerassociative_container_veneer來源:https://synesis.com.au/resources/articles/cpp/veneers.pdf | 譯者:ume