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 중국어 웹사이트의 기타 관련 기사를 참조하세요!