Heim > Backend-Entwicklung > C++ > Wie können wir Kompilierzeitfehler bei der Verwendung von CRTP und Typedef in von C abgeleiteten Klassen beheben?

Wie können wir Kompilierzeitfehler bei der Verwendung von CRTP und Typedef in von C abgeleiteten Klassen beheben?

Linda Hamilton
Freigeben: 2024-12-06 17:53:12
Original
884 Leute haben es durchsucht

How Can We Address Compile-Time Errors When Using CRTP and Typedef in C   Derived Classes?

Statischer Polymorphismus und Typedef-Verwendung aus abgeleiteten Klassen in C

Eine der leistungsstarken Funktionen von C, Curiously Recurring Template Pattern (CRTP), ermöglicht statischen Polymorphismus. Dies ermöglicht eine flexible Kompilierungszeit bei der Bestimmung des Typs der erstellten Objekte basierend auf den Vorlagenargumenten. Die Erweiterung von CRTP, um die Änderung von Funktionsrückgabetypen basierend auf abgeleiteten Typen zu ermöglichen, stellt jedoch eine Herausforderung dar.

Betrachten Sie den folgenden Code, der versucht, CRTP zu verallgemeinern:

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();
    }
};
Nach dem Login kopieren

Dieser Code kann nicht kompiliert werden Microsoft Visual Studio 2010 aufgrund des Fehlers: „value_type“ ist kein Mitglied von 'derived'.

Das Problem ergibt sich aus der Tatsache, dass „derived“ unvollständig ist, wenn es als Vorlagenargument für „base“ in seiner Basisklassenliste verwendet wird. Um dieses Problem zu beheben, besteht eine übliche Problemumgehung darin, eine Traits-Klassenvorlage zu verwenden.

Einführung der base_traits-Vorlage:

template <typename derived_t> 
struct base_traits;
Nach dem Login kopieren

Neudefinition der Basisklasse mithilfe der 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));
    }
};
Nach dem Login kopieren

Und Spezialisierung auf Basismerkmale für abgeleitete:

template <typename T> 
struct base_traits<derived<T> > {
    typedef T value_type;

    static value_type call_foo(derived<T>* x) { 
        return x->derived_foo(); 
    }
};
Nach dem Login kopieren

Dieser Ansatz ermöglicht die Verwendung von sowohl Typen als auch Funktionen aus der abgeleiteten Klasse durch die Merkmale. Durch die Spezialisierung von base_traits für jedes Vorlagenargument können Sie die erforderlichen Mitglieder für jede abgeleitete Klasse bereitstellen.

Das obige ist der detaillierte Inhalt vonWie können wir Kompilierzeitfehler bei der Verwendung von CRTP und Typedef in von C abgeleiteten Klassen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage