2011-08-24 165 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命名空間。這些擴展程序完全符合您正在嘗試執行的操作。

相關問題