簡體   English   中英

如何在C ++中表示基本的Mixin行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM