Если скорость является беспокойством, почему бы не отгородить перегородкой обычно используемый набор исходных данных и их значений к таблице поиска и затем делает любой оптимизированный волшебный алгоритм, Вы придумали для исключительных случаев?
В 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 : Я исправил пример класса функтора, применяя операторы <или> к универсальный тип не
В 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)