Heim >Backend-Entwicklung >C++ >Wie können C-Merkmale Kompilierungsprobleme mit statischem Polymorphismus und Typedefs im Curiously Recurring Template Pattern lösen?

Wie können C-Merkmale Kompilierungsprobleme mit statischem Polymorphismus und Typedefs im Curiously Recurring Template Pattern lösen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 01:51:09232Durchsuche

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

Statischer Polymorphismus und Typedefs in C

Curiously Recurring Template Pattern (CRTP) ist eine Technik in C, um statischen Polymorphismus zu erreichen. Wenn jedoch versucht wird, dieses Muster zu verallgemeinern, um Rückgabetypen basierend auf abgeleiteten Typen zu ändern, wird der Code möglicherweise nicht kompiliert, wie es bei einem Benutzer der Fall ist, der MSVC 2010 verwendet.

Problem:

Der folgende Code, der verschiedene Rückgabetypen in der abgeleiteten Klasse zulassen soll, kann nicht kompiliert werden:

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

Der Fehler ist aufgetreten ist „ist kein Mitglied von ‚derived‘.“ Dies liegt daran, dass der abgeleitete Typ unvollständig ist, wenn er als Vorlagenargument für seine Basisklasse verwendet wird.

Lösung mit Merkmalen:

Eine übliche Problemumgehung besteht darin, eine Merkmalsklassenvorlage zu verwenden. Bei diesem Ansatz wird eine base_traits-Klassenvorlage definiert, um sowohl Typen als auch Funktionen der abgeleiteten Klasse zu kapseln. Die ursprüngliche Basisklasse wird geändert, um diese Merkmale zu verwenden.

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

Durch die Spezialisierung der base_traits-Klasse für jeden Typ, der im abgeleiteten Vorlagenargument verwendet wird, kann über die Merkmale auf die gewünschten Typen und Funktionen zugegriffen werden, wodurch sowohl statische als auch statische Eigenschaften möglich sind Polymorphismus und dynamische Rückgabetypen.

Das obige ist der detaillierte Inhalt vonWie können C-Merkmale Kompilierungsprobleme mit statischem Polymorphismus und Typedefs im Curiously Recurring Template Pattern lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn