与其他参数一起传递操作(Passing an operator along with other p

2019-06-26 22:37发布

我具有其中许多线出现4次,我去通过置换一些非常低效的代码“<”和“>”的操作和各种变量和常量。 这似乎是有一次写的功能,并通过与必然改变价值观和“裁判”变量一起经营的方式。 我有什么技术来学习? “代表们”已经提出,但我不明白如何以这种方式使用它们。 这是在C#2.0,VS2005,但如果技术是通用的,可以用C ++也可以使用,那将是巨大的。

请求对于一些代码:以下出现在许多不同的形式,用不同的“<”和“>”符号以及的“+”和混合“ - ”符号:

if (move[check].Ypos - move[check].height / 200.0D < LayoutManager.VISIO_HEIGHT - lcac_c.top)
{
  move[check].Ypos = move[check].Ypos + adjust;
.
.
.

Answer 1:

在C ++中,使用std::lessstd::greater函子。 这两种方法都继承std::binary_function ,所以你的泛型函数应该接受这种类型的实例。

在.NET中,相当于std::binary_functionFunc<T, U, R> 有没有等同std::lessstd::greater ,但它是相当微不足道的创建。 请看下面的例子。

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);
}

编辑 :我校正函子类的实例作为应用<或>运营商的通用型不工作(以相同的方式,因为它与C ++模板一样)。



Answer 2:

在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;
        }
    }
}

您也应该检查你的paramater委托不为NULL。

这是这样做的C法:

bool (*operator_func)(float a, float b)


Answer 3:

在比较器类定义枚举操作后

     public static class Comparer
{
    public static bool IsTrue<T, U>(T value1, Operator comparisonOperator, U value2)
                where T : U
                where U : IComparable
    {
        switch (comparisonOperator)
        {
            case Operator.GreaterThan:
                return value1.CompareTo(value2) > 0;
            case Operator.GreaterThanOrEqual:
                return value1.CompareTo(value2) >= 0;
            case Operator.LessThan:
                return value1.CompareTo(value2) < 0;
            case Operator.LessThanOrEqual:
                return value1.CompareTo(value2) <= 0;
            case Operator.Equal:
                return value1.CompareTo(value2) == 0;
            default:
                return false;
        }
    }

    public enum Operator
    {
        GreaterThan = 1,
        GreaterThanOrEqual = 2,
        LessThan = 3,
        LessThanOrEqual = 4,
        Equal = 5
    }
}

你可以这样调用:

 if (IsTrue(var1, Operator.GreaterThanOrEqual,  var2))
    Console.WriteLine("var1 is greater than var2");
 else
    Console
        .WriteLine("Unfortunately var1 is not greater than or equal var2. Sorry about that.");



文章来源: Passing an operator along with other parameters