Die Idee ist, dass ich eine Funktion haben, die etwas Arithmetik mit dem Eingang der Fall ist, so vielleicht so etwas wie:Wie man is_arithmetic macht <myClass> :: Wert, um wahr zu sein?
#include <type_traits>
#include <vector>
using namespace std;
template<typename T>
double mean(const vector<T>& vec)
{
static_assert(is_arithmetic<T>::value, "Arithmetic not possible on this type");
//compute mean (average)
}//mean
Dies funktioniert gut, und berechnet den Mittelwert für alle Zahlentypen, die ich in Führung gebracht, doch lässt. dann eine neue Klasse erstellen, sage ich:
class foo
{
// class that has arithmetic operations created
};// foo
und in der Definition dieser Klasse, ich die benötigten Operatoren definiert, + und /, so arbeiten sie mit erwarteten Eingaben. Jetzt möchte ich meine mittlere Funktion mit meiner neuen Klasse verwenden, aber sie wird aufgrund der static_assert offensichtlich nicht kompiliert. Wie kann ich dem Compiler mitteilen, 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 brauche ich, um einen neuen Test zu erstellen, überprüft, dass
is_arithmetic<T>::value || type(T,foo)
oder so etwas zu sehen?
Ich würde es vorziehen, nur meine Klasse anzupassen, anstatt die Funktion, wenn möglich, aber ich bin neugierig auf eine Lösung.
Sie müssen Ihr eigenes Merkmal schreiben. –
@ T.C. Okay, dachte ich genauso. Ist das so einfach, ein neues 'struct' zu erstellen, wie' is_like_number' und über eine Template-Spezifikation, die es für 'foo' für wahr erklärt? Nevermind, antworten Sie es unten. Danke – user2386276