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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-03 14:35:14302瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn