반복 없는 C의 자기 참조 클래스
C는 둘러싸는 유형을 나타내는 PHP의 self 키워드와 동등한 것을 제공하지 않습니다. 수업. 특정 클래스에 대해 이를 에뮬레이트하려면 다음을 정의할 수 있습니다.
struct Foo { typedef Foo self; };
그러나 이를 위해서는 클래스 이름을 반복해야 하므로 조용한 버그가 발생할 여지가 남아 있습니다. decltype과 친구를 사용하여 이를 달성하는 "자율적인" 방법이 있습니까?
최상위 수준에서 이 구문을 잘못 사용하여 다음 구문이 실패합니다.
struct Foo { typedef decltype(*this) self; };
한 가지 해결 방법은 다음 구문을 도입하는 것입니다. 템플릿 클래스 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!