Heim >Backend-Entwicklung >C++ >Wie kann man eine Vorlagenfunktion innerhalb einer C-Vorlagenklasse explizit explizit spezialisieren?
Explizite Spezialisierung der Template-Funktion in der Template-Klasse in C
In C kann es bei der Arbeit mit Template-Klassen und -Funktionen erforderlich sein spezialisieren Sie explizit eine Vorlagenfunktion innerhalb einer Vorlagenklasse. Allerdings kann es schwierig sein, hierfür die richtige Syntax zu finden.
Bedenken Sie den folgenden Code:
struct tag {}; template< typename T > struct C { template< typename Tag > void f( T ); // declaration only template<> inline void f< tag >( T ) {} // ERROR: explicit specialization in non-namespace scope };
Dieser Code, der in Visual C 2008 erfolgreich kompiliert werden kann, in GCC 4.2 jedoch fehlschlägt, versucht dies Spezialisieren Sie die f-Funktion explizit für den Tag-Typ innerhalb der C-Vorlagenklasse. Der Compilerfehler weist darauf hin, dass eine explizite Spezialisierung in einem Nicht-Namespace-Bereich innerhalb der Vorlagenklasse nicht zulässig ist.
Der richtige Weg, eine Vorlagenfunktion innerhalb einer Vorlagenklasse explizit zu spezialisieren, besteht darin, Aufrufe an eine Mitgliedsfunktion von a weiterzuleiten teilweise spezialisierter Typ. Dies kann mithilfe einer Hilfsklasse erfolgen:
template<class T, class Tag> struct helper { static void f(T); }; template<class T> struct helper<T, tag1> { static void f(T) {} }; template<class T> struct C { // ... template<class Tag> void foo(T t) { helper<T, Tag>::f(t); } };
In diesem Code ist „Helper“ eine Vorlagenklasse mit zwei Vorlagenparametern: T (der Typ des Objekts, an dem gearbeitet wird) und Tag (das Spezialisierungs-Tag). . Für die tag1-Spezialisierung ist eine teilweise spezialisierte Version des Helfers definiert, die die Implementierung für die f-Funktion bereitstellt. Die C-Vorlagenklasse verwendet dann eine Mitgliedsfunktion foo, um Aufrufe basierend auf dem angegebenen Tag an die entsprechende Hilfsfunktion
Das obige ist der detaillierte Inhalt vonWie kann man eine Vorlagenfunktion innerhalb einer C-Vorlagenklasse explizit explizit spezialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!