파생 클래스의 Typedef를 사용하는 C 정적 다형성(CRTP)
컴파일 시간 다형성이라고도 알려진 정적 다형성에서 다음 유형은 파생 클래스는 컴파일 타임에 기본 클래스에 알려집니다. 이는 호기심이 반복되는 템플릿 패턴(CRTP)을 사용하여 달성할 수 있습니다. 그러나 파생된 유형을 기반으로 함수의 반환 유형을 사용자 정의할 수 있습니다.
다음 코드를 고려하세요.
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); //return some T object (assumes T is default constructable) } };
그러나 이 코드는 다음 사용으로 인해 컴파일되지 않을 수 있습니다. 기본 클래스 템플릿 내 파생 클래스의 별칭 value_type 유형. 기본에 대한 템플릿 인수로 사용될 때 파생 항목이 불완전하다는 오류가 있습니다.
한 가지 해결책은 특성 클래스 템플릿을 사용하는 것입니다. 수정된 예는 다음과 같습니다.
// Declare a base_traits traits class template: template <typename derived_t> struct base_traits; // Define the base class that uses the traits: template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; value_type base_foo() { return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this)); } }; // Define the derived class; it can use the traits too: template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; // Declare and define a base_traits specialization for derived: template <typename T> struct base_traits<derived<T>> { typedef T value_type; static value_type call_foo(derived<T>* x) { return x->derived_foo(); } };
각 파생 유형에 대해 base_traits를 특수화하여 기본 클래스 템플릿에 필요한 필수 멤버(value_type 및 call_foo)를 제공할 수 있습니다. 이를 통해 기본 클래스 템플릿 내의 파생 클래스에서 typedef 및 함수에 액세스하여 사용자 정의된 반환 유형으로 정적 다형성을 달성할 수 있습니다.
위 내용은 C의 CRTP는 정적 다형성을 위해 파생 클래스의 Typedef를 어떻게 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!