Re: Помогите с Ограничением универсального типа "where"
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.09.09 09:09
Оценка:
Здравствуйте, https://me.yahoo.com/dj_raphael#dbd53, Вы писали:

HMY>хотел сделать универсальную функцию для обработки 16-битных и 8-битных изображений. Изображение поступает в виде блока памяти.


HMY>
HMY>private void ProcessImage<T>(IntPtr pImg, byte[] pixels) where T: byte, ushort {
HMY>  unsafe{
HMY>    T* t = (T*) pImg;
HMY>  }
HMY>}
HMY>


HMY>при обявлении указателя вылазит такая ошибка:

HMY>Cannot take the address of, get the size of, or declare a pointer to a managed type ('T')
Да, generic тип T никак не ассоциируется у компилятора с unmanaged типом, с которым можно работать через указатель.

HMY>пытался прописать:

HMY>where T: byte, ushort
HMY>where T: Byte, Int16
HMY>прописать тоже не даёт. пришлось дублировать код.
HMY>подскажите что нибудь тут можно сделать чтобы код не дублировать?

Можно кое-что предпринять. Но надо помнить, что generic типы и указатели несовместимы.

нужно объявить какой-нибудь интерфейс вроде

interface IMath<T>
{
    T Add(T a, T b);
    T Mul(T a, T b);
    ...
}


И подавать на обобщенный метод одну реализацию интерфейса вроде
struct ByteMath : IMath<byte>
{
    public byte Add(byte a, byte b) { ... }
}


Метод лучше объявить так

private void ProcessImage<T, TMath>(IntPtr pImg, byte[] pixels, TMath math)
    where TMath : IMath<T>


math через generic аргумент передается для инлайнинга методов. За счет него производительность будет сравнима с производительностью метода, написанным "в лоб".

Выглядит просто, но скорее всего потребуется гораздо большее число операций, в том числе преобразование T в int и обратно, сложение T с int, сравнение, и куча всего.

Код будет менее наглядный, но от дублирования поможет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.