>백엔드 개발 >C++ >C 특성은 이상하게 반복되는 템플릿 패턴에서 정적 다형성 및 Typedef와 관련된 컴파일 문제를 어떻게 해결할 수 있습니까?

C 특성은 이상하게 반복되는 템플릿 패턴에서 정적 다형성 및 Typedef와 관련된 컴파일 문제를 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-11 01:51:09232검색

How Can C   Traits Solve Compilation Issues with Static Polymorphism and Typedefs in the Curiously Recurring Template Pattern?

C의 정적 다형성 및 형식 정의

CRTP(Curiously Recurring Template Pattern)는 C에서 정적 다형성을 달성하는 기술입니다. 그러나 파생된 유형을 기반으로 반환 유형을 수정하기 위해 이 패턴을 일반화하려고 하면 MSVC 2010을 사용하는 사용자가 겪은 것처럼 코드가 컴파일되지 않을 수 있습니다.

문제:

파생 클래스에서 다양한 반환 유형을 허용하기 위한 다음 코드는 실패합니다. compile:

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

발생한 오류는 "'파생'의 멤버가 아닙니다.'"입니다. 이는 파생 유형이 기본 클래스의 템플릿 인수로 사용될 때 불완전하기 때문에 발생합니다.

특성을 사용한 솔루션:

일반적인 해결 방법은 특성 클래스 템플릿을 사용하는 것입니다. 이 접근 방식에서는 파생 클래스의 유형과 함수를 모두 캡슐화하기 위해 base_traits 클래스 템플릿이 정의됩니다. 원래 기본 클래스는 이러한 특성을 사용하도록 수정되었습니다.

template <typename derived_t>
struct base_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));
    }
};

template <typename T>
struct derived : base<derived<T>> {
    typedef typename base_traits<derived>::value_type value_type;
    value_type derived_foo() {
        return value_type();
    }
};

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 클래스를 특수화하면 특성을 통해 원하는 유형과 함수에 액세스할 수 있으며 정적 및 정적 특성을 모두 사용할 수 있습니다. 다형성 및 동적 반환 유형

위 내용은 C 특성은 이상하게 반복되는 템플릿 패턴에서 정적 다형성 및 Typedef와 관련된 컴파일 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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