Идея заключается в том, что у меня есть функция, которая делает что-то арифметика на вход, так что, возможно, что-то вроде:Как сделать is_arithmetic <myClass> :: значение должно быть правдой?
#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
Это прекрасно работает, и вычисляет среднее значение для всех типов номеров, которые я ставлю в Но давайте. скажу я создаю новый класс:
class foo
{
// class that has arithmetic operations created
};// foo
и в определении этого класса, я определил необходимые операторы + и /, поэтому они работают с ожидаемыми входами. Теперь я хочу использовать свою среднюю функцию с моим новым классом, но она, очевидно, не будет компилироваться из-за static_assert. Итак, как мне сообщить компилятору, что мой новый класс должен удовлетворять is_arithmetic<foo>::value
?
Было бы здорово, если бы я создал класс, который мог бы дать ему тип, который удовлетворяет is_arithmetic, но похоже, что это может вызвать проблему с type_traits каким-то образом?
Или мне нужно создать новый тест, который проверяет
is_arithmetic<T>::value || type(T,foo)
или что-то подобное?
Я бы предпочел только адаптировать мой класс, а не функцию, если это возможно, но мне интересно, какое решение.
Вам необходимо написать собственный отзыв. –
@ T.C. Ладно, я так и думал. Это простое создание новой 'struct' like' is_like_number' и с помощью спецификации шаблона, объявляющей ее true для 'foo'? Nevermind, вы отвечаете на него ниже. Спасибо – user2386276