C での self メンバー型の自律実装
C には、型を示す PHP にある self キーワードの明示的な構文がありません。囲んでいるクラスの。従来、この動作は各クラス内で typedef エイリアスを定義することで手動でエミュレートできました:
struct Foo { typedef Foo self; };
ただし、このアプローチではクラス名を繰り返す必要があり、不一致やエラーの潜在的なリスクが生じます。これに対処するために、decltype とその仲間を利用する代替メソッドが提案されています。
struct Foo { typedef decltype(*this) self; };
残念ながら、この構文はクラス定義のコンテキストでは無効です。
self の自律的な実装を実現するには、より洗練されたアプローチが必要です。テンプレート メタプログラミングを利用すると、手動による型レプリケーションの必要性を排除しながら、クラスの動作をカプセル化するクラス テンプレート Self を定義できます:
template <typename...Ts> class Self; template <typename X, typename...Ts> class Self<X,Ts...> : public Ts... { protected: typedef X self; };
このメカニズムを採用するために、2 つのマクロを導入します:
#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; } };
For派生クラスでは、WITH_SELF_DERIVED マクロにより多重継承が可能です。
class WITH_SELF_DERIVED(Bar,Foo) { /* ... */ };
このソリューションは、gcc 4.8 と Clang 3.4 の両方と互換性があり、明示的なクラス名の繰り返しを必要とせずに C で self メンバー型を自律的に実装できます。
以上がC で「self」メンバー型を自動的に実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。