处理float和double类型具有相同的泛型参数
问题描述:
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];
}
}
}
}
理想我会想办法限制吨至只有那些定义为得到一个编译时的+
操作类型错误,但是运行时异常会失败。 另外我想添加隐式转换,然后从Matrix<float>
到Matrix<double>
但这些不能在Matrix<T>
类中定义,无论如何围绕这个? 我知道T4模板可以用来为每种类型生成一个矩阵,但是这些类型需要事先指定,我希望这可以用于定义运算符的任何类型。
答
你必须创建将处理+操作的表达式:
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]);
看http://linqlib.codeplex.com/在扩展下LinqLib.Operators命名空间。这些扩展程序完全符合您正在尝试执行的操作。
不幸的是,像其他任何静态函数一样,不能在泛型类中调用重载运算符。恐怕T4将是你最好的选择。 – Gabe