>백엔드 개발 >C++ >C에서 `self` 멤버 유형을 자동으로 구현하려면 어떻게 해야 합니까?

C에서 `self` 멤버 유형을 자동으로 구현하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-07 21:39:13408검색

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;
};

이 메커니즘을 사용하기 위해 두 개의 매크로를 소개합니다.

#define WITH_SELF(X) X : public Self<X>
#define WITH_SELF_DERIVED(X,...) X : public Self<X,__VA_ARGS__>

이러한 매크로를 사용하여 self 멤버 유형으로 클래스를 정의할 수 있습니다.

class WITH_SELF(Foo)
{
    void test()
    {
        self foo;
    }
};

파생 클래스의 경우 WITH_SELF_DERIVED 매크로는 다중 상속을 허용합니다.

class WITH_SELF_DERIVED(Bar,Foo)
{
    /* ... */
};

이 솔루션은 gcc 4.8 및 clang 3.4와 모두 호환되므로 명시적인 클래스 이름 반복 없이 C에서 self 멤버 유형을 자율적으로 구현할 수 있습니다.

위 내용은 C에서 `self` 멤버 유형을 자동으로 구현하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.