使用 CRTP 避免運行時多態性
在 C 中,虛擬成員函數的使用會在運行時引入額外的開銷。 CRTP(奇怪的重複模板模式)提出了一種替代方法來避免這種開銷,同時保留多態性。
有兩種使用 CRTP 來實現此目標的方法。
靜態型別專業化
第一種方法涉及為型別結構靜態定義介面。這是透過建立具有虛擬成員函數的基底模板類別來實現的。然後,派生類別可以實例化此模板類別並實現虛擬成員函數:
<code class="cpp">template <class Derived> struct Base { virtual void foo() {} }; struct MyType : Base<MyType> { void foo() override; }; struct YourType : Base<YourType> { void foo() override; };</code>
透過編譯時類型推導進行靜態調度
第二種方法避免使用基址引用或基址指標習慣用法。相反,連接是在編譯時透過模板函數建立的,模板函數在運行時推導類型:
<code class="cpp">template <class T> void bar(Base<T>& obj) { obj.foo(); }</code>
使用此方法,只有來自 Base 的衍生類別可以傳遞給 bar。這允許靜態分派並消除與虛擬成員函數相關的開銷:
<code class="cpp">bar(MyType()); // Calls MyType::foo() bar(YourType()); // Calls YourType::foo()</code>
總之,CRTP 提供了在 C 中實現靜態多態性的強大機制。透過專門化類型結構的介面或透過編譯時類型推導執行靜態分派,開發人員可以避免虛擬成員函數的執行時間開銷,同時保持多態性的彈性。
以上是奇怪的循環模板模式 (CRTP) 如何在 C 中實現靜態多態性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!