首頁 > 後端開發 > C++ > 如何在C類別中實作自引用而不重複類別名稱?

如何在C類別中實作自引用而不重複類別名稱?

Mary-Kate Olsen
發布: 2024-12-03 14:35:14
原創
281 人瀏覽過

How Can I Achieve Self-Referencing in C   Classes Without Repeating the Class Name?

C 中不重複的自引用類別

C 沒有提供與PHP 的self 關鍵字等效的關鍵字,該關鍵字表示封閉類別的類型班級。要為特定類別模擬它,可以定義:

struct Foo { typedef Foo self; };
登入後複製

但是,這需要重複類別名稱,為靜默錯誤留出空間。是否有一種使用 decltype 和朋友的「自主」方法來實現此目的?

以下語法由於在頂層無效使用而失敗:

struct Foo { typedef decltype(*this) self; };
登入後複製

一個解決方案涉及引入模板類Self如下:

template <typename... Ts>
class Self;

template <typename X, typename... Ts>
class Self<X, Ts...> : public Ts... {
  typedef X self;
};
登入後複製

然後可以使用宏來簡化類別定義:

#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X, ...) X : public Self<X, __VA_ARGS__>

class WITH_SELF(Foo) {
  void test() { self foo; }
};
登入後複製

派生可以透過以下方式處理:

class WITH_SELF_DERIVED(Bar, Foo) {
  /* ... */
};
登入後複製

多重繼承和可變參數巨集可以輕鬆地與複雜的類別層次結構整合:

class WITH_SELF(Foo2) { /* ... */ };

class WITH_SELF_DERIVED(Bar2, Foo, Foo2) {
  /* ... */
};
登入後複製

這種技術已通過GCC 4.8 和 Clang 3.4 進行測試和驗證。

以上是如何在C類別中實作自引用而不重複類別名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板