2011-08-24 108 views
1

说我有:处理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模板可以用来为每种类型生成一个矩阵,但是这些类型需要事先指定,我希望这可以用于定义运算符的任何类型。

+2

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

回答

0

你必须创建将处理+操作的表达式:

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命名空间。这些扩展程序完全符合您正在尝试执行的操作。