Ich möchte prüfen, ob zwei Typen gleich sind, aber unabhängig von ihren Template-Parametern. Etwas wie folgt aus:Wie überprüft man, ob zwei Typen aus der gleichen Template-Klasse stammen
template<class T>
class A {};
class B {};
int main() {
cout << std::is_same_template<A<int>, A<string>>::value << endl; // true
cout << std::is_same_template<A<int>, B>::value << endl; // false
}
Ich bin mir bewusst, std::is_same
zu überprüfen, ob zwei Typen exacty entsprechen.
Ein Grund, warum ich das brauchen: Ich habe eine Templat-Methode, die mit jeder Art bezeichnet werden kann, aber ich möchte, dass verbieten, ist mit Art A
(das Templat-) genannt wird, möglicherweise durch einen static_assert
verwenden. Wurde A
nicht als Templat, ich glaube, es leicht std::is_same
mit getan werden könnte, aber jetzt, ich habe ein Problem ...
EDIT: ich manuell A für ein paar gemeinsamen Ts ausschließen kann, indem ich für eine Suche so, wie es für alle T zu tun:
static_assert(!std::is_same<parameter_type, A<int>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<double>>::value, "Cannot use this function with type A<T>");
static_assert(!std::is_same<parameter_type, A<bool>>::value, "Cannot use this function with type A<T>");
Zwei Arten sind nicht gleich, wenn ihre Template-Parameter unterschiedlich sind. Somit sind "A" und "A " weit davon entfernt, vom gleichen Typ zu sein. –
skypjack
Nun, ich bin mir dessen bewusst, deshalb kann ich 'std :: is_same' nicht verwenden. Was ich frage ist, wenn es eine Möglichkeit gibt, weniger streng zu vergleichen, A und A Vergleich gleich und A und B nicht zu machen? –
jureslak
Sie können den umgekehrten Ansatz mittels Template-Spezialisierung verwenden, akzeptieren Sie also nur die erlaubten Klassen und definieren Sie ansonsten eine leere/zerbrochene/werfende/was auch immer Funktion. – skypjack