Передача оператора наряду с другими параметрами

Если скорость является беспокойством, почему бы не отгородить перегородкой обычно используемый набор исходных данных и их значений к таблице поиска и затем делает любой оптимизированный волшебный алгоритм, Вы придумали для исключительных случаев?

10
задан Rob Kennedy 27 July 2009 в 20:05
поделиться

2 ответа

В C ++ используйте функторы std :: less и std :: great . Оба эти метода наследуют std :: binary_function , поэтому ваша универсальная функция должна принимать экземпляры этого типа.

В .NET эквивалентом std :: binary_function является ] Func . Нет эквивалентов std :: less и std :: better , но создать их довольно тривиально. См. Следующий пример.

static class Functor
{
    static Func<T, T, bool> Greater<T>()
        where T : IComparable<T>
    {
        return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) > 0; };
    }

    static Func<T, T, bool> Less<T>()
        where T : IComparable<T>
    {
        return delegate(T lhs, T rhs) { return lhs.CompareTo(rhs) < 0; };
    }
}

Обратите внимание, что в приведенном выше коде используется класс Func <> из .NET 3.5. Если это неприемлемо, подумайте об определении собственного делегата.

Пример вызова C ++:

void DoWork(const std::binary_function<int, int, bool>& myOperator,
            int arg1, int arg2)
{
    if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}

void main()
{
    DoWork(std::less<int>(), 100, 200);
    DoWork(std::greater<int>(), 100, 200);
}

Пример вызова C #:

void DoWork(Func<int, int, bool> myOperator, int arg1, int arg2)
{
    if (myOperator(arg1, arg2)) { /* perform rest of work */ }
}

void main()
{
    DoWork(Functor.Less<int>(), 100, 200);
    DoWork(Functor.Greater<int>(), 100, 200);
}

EDIT : Я исправил пример класса функтора, применяя операторы <или> к универсальный тип не

11
ответ дан 3 December 2019 в 23:14
поделиться

В C # используйте делегаты для передачи символа " < "и" > "к коду, выполняющему работу.

Пример C #:

public delegate bool BooleanOperatorDelegate(int a, int b)

class OperatorsImplementer {
    public bool OperatorLess(int a, int b) {
         return a < b;
    }
}

class AnotherOperatorsImplementer {
    public bool OperatorLess(int a, int b) {
         return (a + 1) < (b - 1);
    }
}

class OperatorUser {
    int DoSomethingObscene(int a, int b, BooleanOperatorDelegate operator) {
        if (operator(a, b)) {
            return 5;
        }
        else {
            return -5;
        }
    }
}

Вы также должны проверить, что делегат, который вы получаете в качестве параметра, не равен NULL .

Это метод C:

bool (*operator_func)(float a, float b)
2
ответ дан 3 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: