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