繰り返しのない C の自己参照クラス
C は、囲んでいるクラスの型を表す PHP の self キーワードに相当するものを提供しません。クラス。特定のクラスに対してこれをエミュレートするには、次のように定義できます。
struct Foo { typedef Foo self; };
ただし、これにはクラス名を繰り返す必要があり、サイレント バグが発生する余地が残ります。 decltype とその仲間を使用してこれを実現する「自律的な」方法はありますか?
トップレベルでの this の無効な使用により、次の構文は失敗します:
struct Foo { typedef decltype(*this) self; };
1 つの解決策には、テンプレート クラス 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 中国語 Web サイトの他の関連記事を参照してください。