>백엔드 개발 >C++ >C의 CRTP는 정적 다형성을 위해 파생 클래스의 Typedef를 어떻게 처리할 수 있습니까?

C의 CRTP는 정적 다형성을 위해 파생 클래스의 Typedef를 어떻게 처리할 수 있습니까?

DDD
DDD원래의
2024-12-10 09:42:18943검색

How Can CRTP in C   Handle Typedefs from Derived Classes for Static Polymorphism?

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

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