Die Idee ist, dass ich eine Funktion habe, die etwas arithmetisches zur Eingabe macht, also vielleicht etwas wie:
%Vor%Das funktioniert großartig und berechnet den Mittelwert für alle Zahlentypen, die ich einstelle. Aber sagen wir, dass ich dann eine neue Klasse erstelle:
%Vor% Und in der Definition dieser Klasse habe ich die benötigten Operatoren + und / definiert, damit sie mit den erwarteten Eingaben arbeiten. Jetzt möchte ich meine mittlere Funktion mit meiner neuen Klasse verwenden, aber sie wird aufgrund der static_assert offensichtlich nicht kompiliert. Wie sage ich dem Compiler, dass meine neue Klasse is_arithmetic<foo>::value
erfüllen soll?
Es wäre toll, wenn ich beim Erstellen der Klasse einen Typ geben könnte, der is_arithmetic erfüllt, aber das scheint irgendwie ein Problem mit type_traits zu verursachen?
Oder müsste ich einen neuen Test erstellen, der prüft, ob
angezeigt wird %Vor%oder so?
Ich würde es vorziehen, nur meine Klasse anzupassen, anstatt die Funktion, wenn möglich, aber ich bin neugierig auf eine Lösung.
Die Merkmale der Standardbibliothek, z. B. std::is_arithmetic
, mit einer Ausnahme ( std::common_type
) sind "in Stein gemeißelt". Der Versuch, sie zu spezialisieren, führt zu undefiniertem Verhalten. is_arithmetic
testet, ob der Typ ein arithmetischer Typ ist, wie er im Standard definiert ist; Benutzerdefinierte Typen sind niemals arithmetische Typen.
Sie können Ihr eigenes Merkmal schreiben, das auf Unterstützung für die arithmetischen Operatoren testet:
%Vor% Die partielle Spezialisierung wird nur dann übereinstimmen, wenn alle vier Ausdrücke wohlgeformt sind (d. h. dass T
die Operatoren +, -, *, /
unterstützt).
Demo .
std::is_arithmetic<T>::value
ist definitionsgemäß nur true
, wenn T
ein arithmetischer Typ ist, ausgedrückt als C ++ - Standard, der ein integraler oder schwebender Typ ist, der wiederum nur grundlegende Typen sind:
Typen
bool
,char
,char16_t
,char32_t
,wchar_t
und die Ganzzahlarten mit und ohne Vorzeichen werden gemeinsam als ganzzahlige Typen bezeichnet.Es gibt drei Gleitkomma -Typen:
float
,double
undlong double
.