Wie macht is_arithmeymyClass :: value wahr?

8

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.

    
user2386276 17.10.2014, 22:12
quelle

2 Antworten

17

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 .

    
T.C. 17.10.2014, 22:21
quelle
2

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 und long double .

    
Anton Savin 17.10.2014 22:22
quelle

Tags und Links