Heim >Backend-Entwicklung >C++ >Wie kann festgestellt werden, ob eine Klasse eine Spezialisierung einer Klassenvorlage in C ist?

Wie kann festgestellt werden, ob eine Klasse eine Spezialisierung einer Klassenvorlage in C ist?

Barbara Streisand
Barbara StreisandOriginal
2024-11-17 18:56:02227Durchsuche

How to Determine if a Class is a Specialization of a Class Template in C  ?

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 um mit A<*> übereinzustimmen, was zu einer Druckanweisung von 1 führt.

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!

Stellungnahme:
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