Ich habe eine Funktionsvorlage und ich möchte die Reihe der Typen, für die es instanziiert werden kann, einschränken.Definieren eines benutzerdefinierten Prädikats als eine Kombination aus Std :: Is_Same
Ich schrieb etwas wie folgt aus:
template <typename T>
void DoSomething(/* ... Some parameters involving T ... */)
{
// Check at compile-time that T is allowed
static_assert(
std::is_same<T, int>::value
|| std::is_same<T, float>::value
|| std::is_same<T, double>::value
...
|| std::is_same<T, /* other type */>::value,
"Type not allowed");
}
ich die gleiche Prüfung für andere Funktionsschablonen zu wiederholen.
Eine naheliegende Lösung wäre Kopieren und Einfügen der oben genannten static_assert
Überprüfung, aber das wäre schlecht für die Code-Wartbarkeit.
Eine bessere Lösung könnte sein, die static_assert
Prüfung in eine Ad-hoc- Helfer-Funktion zu wickeln, und rufen Sie es in jeder Funktion Vorlagen, in denen ich die Typüberprüfung benötigen.
Aber was glaube, ich würde mehr elegant sein definiert eine benutzerdefinierte Kombination von std::is_same
Anrufe, dass ich so verwenden könnte:
static_assert(IsTypeAllowed<T>::value, "Type not allowed");
Wie kann ich meine Gewohnheit definieren IsTypeAllowed<T>
als eine Kombination von std::is_same
Anrufe ||
'Ed zusammen?
Wenn Sie nur ganzzahlige Typen ausschließen möchten, können Sie mit [ ' std :: is_integral '] (http://en.cppreference.com/w/cpp/types/is_integral). –
@ πάνταῥεῖ: Danke, ich kannte 'std :: is_integral', aber es ist eine bestimmte Teilmenge Auswahl (es gibt auch andere benutzerdefinierte Typen). –