ホームページ >バックエンド開発 >C++ >C で「self」メンバー型を自動的に実装するにはどうすればよいでしょうか?

C で「self」メンバー型を自動的に実装するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 21:39:13407ブラウズ

How Can We Automatically Implement a `self` Member Type in C  ?

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

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