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; };
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; };
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!