Heim > Backend-Entwicklung > C++ > Wie kann ich mit C Static Polymorphism (CRTP) flexible Rückgabetypen erreichen und Kompilierungsfehler vermeiden?

Wie kann ich mit C Static Polymorphism (CRTP) flexible Rückgabetypen erreichen und Kompilierungsfehler vermeiden?

Mary-Kate Olsen
Freigeben: 2024-12-09 00:04:15
Original
792 Leute haben es durchsucht

How Can I Achieve Flexible Return Types with C   Static Polymorphism (CRTP) and Avoid Compilation Errors?

C Statischer Polymorphismus (CRTP) unter Verwendung abgeleiteter Klassentypdefinitionen

Das seltsam wiederkehrende Vorlagenmuster (CRTP) ermöglicht statischen Polymorphismus in C, wird jedoch beim Anstreben zu einer Herausforderung Funktionsrückgabetypen basierend auf dem abgeleiteten Typ ändern. Während CRTP normalerweise den abgeleiteten Typ ableiten kann, treten beim folgenden Code in MSVC 2010 Kompilierungsprobleme auf:

template <typename derived_t>
class base {
public:
    typedef typename derived_t::value_type value_type;
};

template <typename T>
class derived : public base<derived<T>> {
public:
    typedef T value_type;
};
Nach dem Login kopieren

Dieser Fehler tritt auf, weil die abgeleitete Klasse unvollständig ist, wenn sie als Vorlagenparameter für die Basisklasse in der Basis verwendet wird Klassenliste. Um dieses Problem zu beheben, besteht eine übliche Problemumgehung darin, eine Traits-Klassenvorlage zu verwenden:

// Declare the base_traits class template
template <typename derived_t>
struct base_traits;

// Define the base class
template <typename derived_t>
struct base {
    typedef typename base_traits<derived_t>::value_type value_type;
};

// Define the derived class
template <typename T>
struct derived : public base<derived<T>> {
    typedef typename base_traits<derived<T>>::value_type value_type;
};

// Specialization of base_traits for derived
template <typename T>
struct base_traits<derived<T>> {
    typedef T value_type;
};
Nach dem Login kopieren

Durch die Spezialisierung der base_traits-Vorlage auf die gewünschten abgeleiteten Typen können Sie die erforderlichen Mitglieder definieren, einschließlich benutzerdefinierter Rückgabetypen für Funktionen wie foo (). Diese Technik ermöglicht statischen Polymorphismus mit mehr Flexibilität bei den Rückgabetypen und vermeidet gleichzeitig Kompilierungsfehler.

Das obige ist der detaillierte Inhalt vonWie kann ich mit C Static Polymorphism (CRTP) flexible Rückgabetypen erreichen und Kompilierungsfehler vermeiden?. 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