[英]How to represent basic Mixin behavior in C++
考慮一個現有的C ++類層次結構:一個根類,許多子類形成一個直接的非循環圖。
我想在根類中添加一個方法,並可能在某些子代中覆蓋它。 但問題是我禁止修改這些現有的類 (第三方庫,項目策略,封閉源等)。
混合/擴展類將是一個很好的解決方案。 但它在C ++中並非簡單易行。
快速而骯臟的解決方案是編寫一個函數,該函數使用dynamic_cast運算符調度對象的類型,並對每種類型的層次結構執行所需的代碼。 但這有點不好,因為它易於編寫,會破壞封裝,並且不能安全地支持未來的更改。
我正在考慮使用定義{rtti type id,function to call} “ 來維護某種類型的哈希表,並將其用作我想要編寫和覆蓋的函數的虛假VTable 。但我不確定是否會更好......
還有其他想法嗎? 運行時VTable改變? 模板元編程解決方案? 其他?
不要忘記:我絕對不能改變原來的類(既不是標題也不是實現)。
實際上我正在編寫一個這樣做的庫:允許您在運行時從現有類中編寫和修改類型,其成本是無法將方法作為...方法調用,而是作為具有第一個參數的外部函數this
。 它是非侵入式的,因此您無需以任何方式修改現有類。
代碼: https : //github.com/iboB/boost.mixin
Doc: http : //ibob.github.io/boost.mixin/
希望能幫助到你。
PS。 它被稱為Boost.Mixin,因為我打算將它提交給Boost,但它還不是Boost的一部分。
如果您無法更改原始層次結構,那么模板元編程不太可能有所幫助。 記住它是基於編譯時信息。
改變vtable似乎是一個非常糟糕的想法,它顯然是不可移植的,並且假設你有點了解它的物理布局......即使你做對了它也將是一個維護噩夢。
我非常喜歡std::map<type_info, Func>
這個想法。 std::type_info::before
提供了實現所需的全部內容(不依賴於名稱或地址)。
寫一個免費的功能。
void vfunc(base& param);
// ...
base b;
vfunc(b);
deriv0 d0;
vfunc(d0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.