Обработка типов с плавающей запятой и типа double с одинаковыми общими параметрами - PullRequest
1 голос
/ 24 августа 2011

Скажи, что у меня есть:

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<float> в Matrix<double>, но они не могут быть определены в классе Matrix<T>, в любом случае вокруг этого? Я знаю, что шаблоны T4 можно использовать для генерации матрицы для каждого типа, но тогда типы должны быть указаны заранее, и я хотел бы, чтобы это работало для любых типов, для которых определен оператор.

1 Ответ

0 голосов
/ 28 октября 2011

Вы должны создать выражение, которое будет обрабатывать операцию +:

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. Эти расширения делают именно то, что вы пытаетесь сделать.

...