Chodzi o to, że mam funkcję, która robi coś arytmetyki do wejścia, więc może coś takiego:Jak zrobić is_arithmetic <myClass> :: wartość jest prawdziwa?
#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
Działa to doskonale, i oblicza średnią dla wszystkich typów numerycznych, że umieszczone w ale pozwala. powiedzieć, że następnie utworzyć nową klasę:
class foo
{
// class that has arithmetic operations created
};// foo
i w definicji tej klasy i zdefiniowane potrzebne operatory + i /, więc praca z przewidywanych nakładów. Teraz chcę użyć mojej średniej funkcji z moją nową klasą, ale oczywiście nie skompiluje się z powodu static_assert. Więc jak mogę powiedzieć kompilatorowi, że moja nowa klasa powinna zadowolić is_arithmetic<foo>::value
?
Byłoby wspaniale, gdyby podczas tworzenia klasy mogłem nadać mu typ, który spełnia is_arithmetic, ale wydaje się, że może to jakoś powodować problem z type_traits?
A może trzeba utworzyć nowy test, który sprawdza
is_arithmetic<T>::value || type(T,foo)
czy coś takiego?
Wolałbym tylko dostosować moją klasę, a nie funkcję, jeśli to możliwe, ale jestem ciekaw rozwiązania.
Musisz napisać własną cechę. –
@ T.C. Okay, myślałem tak samo. Czy to jest tak proste, tworząc nową 'struct' jak' is_like_number' i poprzez specyfikację szablonu, która deklaruje, że jest prawdziwa dla 'foo'? Nieważne, odpowiadasz poniżej. Dzięki – user2386276