Функция шаблона, которая может взять другую функцию, чтобы проверить, сколько элементов соответствует условию - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть шаблон функции, который принимает другой шаблон функции (класса), который проверяет определенное условие.Все это работает для int или double, но я не знаю, что делать, когда я хочу сделать эту работу для своих дробей.

template <class T, class F>
int HowManyF( int count, T *array, F function )
{
    int howmany = 0;

    for (int i = 0; i < count; i++)
    {
    if ( function(array[i]) )
        howmany++;
    }
    return howmany;
}

template <class T>
class NotNegative
{
    public:
        T operator()(T arg);
};

template <class T>
T NotNegative<T>::operator()(T arg)
{
    if (arg<0) return 0;
    else return 1;
}

class Fraction{
public:
    int numerator;
    int denominator;

    Fraction() {};
    Fraction(int nume, int denom = 1);
    Fraction operator += (const Fraction &u);
};

// this works
int ints[8]  = {1,2,3,4,-5,6,-12,16};
howmany = HowManyF(8,ints,NotNegative());
cout << "NonNegative (ints) " << howmany << endl;

// this not - conditional expression of type 'Fraction' is illegal
// shows in line    if ( function(array[i]) )
Fraction *tab = new Fraction[2];
    tab[0] = Fraction(2, 4);
    tab[1] = Fraction(5, 6);

howmany = HowManyF(2,tab,NotNegative<Fraction>());
cout << "NonNegative (fractions) " << howmany << endl;

Что мне делать?Мне нужно изменить шаблон класса в шаблон функции?Мне нужно добавить несколько операторов в классе дроби?Мне нужно изменить способ, чтобы проверить, если переменная <0? </p>

1 Ответ

0 голосов
/ 12 февраля 2019

Вы указали неверный предикат, особенно тип возвращаемого значения; оно должно быть:

template <class T>
class NotNegative
{
public:
    bool operator()(T arg) const { return !(arg < 0); }
};

Тогда вам, вероятно, понадобится специализация для Fraction или реализация operator < между Fraction и int.

...