首頁 > 後端開發 > C++ > 主體

奇怪的循環模板模式 (CRTP) 如何在 C 中實現靜態多態性?

Mary-Kate Olsen
發布: 2024-10-27 05:48:02
原創
752 人瀏覽過

How Does Curiously Recurring Template Pattern (CRTP) Achieve Static Polymorphism in C  ?

使用 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!