传递操作符和其他参数

use*_*848 10 c# c++ delegates visual-studio

我有一些非常低效的代码,其中许多行出现4次,因为我通过"<"和">"操作以及各种变量和常量进行排列.看起来有一种方法可以编写一次函数并传入运算符以及必要的变化值和"ref"变量.我需要学习什么技巧?有人建议"代表",但我不知道如何以这种方式使用它们.这是在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;
.
.
.
Run Code Online (Sandbox Code Playgroud)

Ste*_*idi 11

在C++中,使用std::lessstd::greaterfunctor.这两种方法都继承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; };
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,上面的代码使用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);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我更正了仿函数类的示例,因为将<或>运算符应用于泛型类型不起作用(以与C++模板相同的方式).