Vorlagenspezialisierungen identifizieren
In C ist es manchmal notwendig zu bestimmen, ob eine bestimmte Klasse eine Spezialisierung einer bestimmten Klassenvorlage ist. Betrachten Sie beispielsweise die folgende Klassenvorlage:
template <class T> struct A {};
Angenommen, wir haben einen Typ CompareT. Wie können wir überprüfen, ob es sich um ein A<> handelt? für irgendeinen Typ ? Betrachten Sie das folgende Beispiel:
template<class CompareT> void compare(){ // is this A ? cout << is_same< A<*> , CompareT >::value; // A<*> ???? } int main(){ compare< A<int> >(); }
In diesem Beispiel erwarten wir A
Lösung:
Ein Ansatz zur Lösung dieses Problems besteht darin, Vorlagen-Metaprogrammierung zu verwenden. Hier ist ein Snippet, mit dem Sie die gewünschte Vorlage angeben können, mit der abgeglichen werden soll:
template <class T, template <class...> class Template> struct is_specialization : std::false_type {}; template <template <class...> class Template, class... Args> struct is_specialization<Template<Args...>, Template> : std::true_type {}; static_assert(is_specialization<std::vector<int>, std::vector>{}, ""); static_assert(!is_specialization<std::vector<int>, std::list>{}, "");
Diese Lösung bietet eine bequeme Möglichkeit zu überprüfen, ob ein bestimmter Typ tatsächlich eine Spezialisierung einer bestimmten Klassenvorlage ist.
Das obige ist der detaillierte Inhalt vonWie kann festgestellt werden, ob eine Klasse eine Spezialisierung einer Klassenvorlage in C ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!