ホームページ >バックエンド開発 >C++ >クラス名を繰り返さずに C クラスで自己参照を実現するにはどうすればよいですか?

クラス名を繰り返さずに C クラスで自己参照を実現するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 14:35:14217ブラウズ

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

繰り返しのない 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。