【问题标题】:Handling float and double types with same generic parameter处理具有相同泛型参数的浮点和双精度类型
【发布时间】:2011-08-24 11:12:41
【问题描述】:

说我有:

public class Matrix<T>
{
    T[][] values;
    ...
}

我想添加一个 + 运算符,它可以处理 int、long、float 和 double 或任何其他类型,为 T 实现了 + 运算符。

例如(这不起作用但传达了我想要做的事情):

public class Matrix<T>
{
    T[][] values;
    ...
    public static Matrix<T> operator +(Matrix<T> A, Matrix<T> B)
    {
        values = ...;
        for (int row = 0; row < rowCount; ++row)
        {
            for (int col = 0; col < colCount; ++col)
            {
                values[row][col] = A.values[row][col] + B.values[row][col];
            }
        }
    }
}

理想情况下,我想要一种方法将 T 限制为仅定义了 + 运算符以获取编译时错误但运行时异常失败的类型。 另外我想添加从Matrix&lt;float&gt;Matrix&lt;double&gt;的隐式转换,但是这些不能在Matrix&lt;T&gt;类中定义,无论如何? 我知道 T4 模板可用于为每种类型生成一个矩阵,但是需要事先指定类型,我希望这适用于定义运算符的任何类型。

【问题讨论】:

  • 不幸的是,像任何其他静态函数一样,您不能在泛型类中调用重载运算符。恐怕 T4 会是你最好的选择。

标签: c# generics operator-overloading


【解决方案1】:

你必须创建一个表达式来处理 + 操作:

private static Func<T, T, T> Add = InitAdd();
private static Func<T, T, T> AddInit()
  {
    Type type = typeof(T);
    ParameterExpression left = Expression.Parameter(type, "left");
    ParameterExpression right = Expression.Parameter(type, "right");
    return Expression.Lambda<Func<T, T, T>>(Expression.Add(left, right), left, right).Compile();
  }

在您的 + 运算符中,您可以调用静态添加函数:

values[row][col] = Add(A.values[row][col], B.values[row][col]);

在 LinqLib.Operators 命名空间下的扩展中查看 http://linqlib.codeplex.com/。这些扩展完全符合您的要求。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2015-05-17
    • 2015-02-20
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多