Здравствуйте,
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, сравнение, и куча всего.
Код будет менее наглядный, но от дублирования поможет.