CRTP:動態多態性的替代方案
動態多態性雖然提供了靈活性,但由於使用虛擬,通常會導致運行時開銷成員函數。幸運的是,C 提供了一種有效的替代方案:奇怪的循環模板模式 (CRTP)。
CRTP 可讓您實現靜態調度,類似於多態性,但沒有虛擬成員函數的開銷。這是透過類型特化和模板推導來完成的。
方法 1:靜態介面規格
透過為派生類型靜態指定接口,您可以在編譯時間。例如,考慮以下程式碼片段:
<code class="cpp">template <class Derived> struct base { void foo() { static_cast<Derived *>(this)->foo(); }; };</code>
在這種情況下,base要求任何派生類型定義 foo() 成員函數以進行編譯。每個衍生類型,例如 my_type 和 your_type,必須實作自己的 foo() 函數才能滿足此要求。
方法 2:編譯時類型推導
或者,您可以避免使用基類的指標或引用並在編譯時執行類型連接。考慮以下模板函數:
<code class="cpp">template <class T> // T is deduced at compile-time void bar(base<T> &obj) { obj.foo(); // does static dispatch }</code>
此函數接受對 base
CRTP 的優點
透過利用 CRTP,您可以在 C 中實現靜態多態性,避免動態多態性的缺點,同時保留物件導向設計的優點。
以上是CRTP:靜態調度可以取代 C 中的動態多態性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!