沒有人有一個想法,如果有可能有原始類型作爲一般的參數。指針作爲泛型C#
注意,你開始談論我如何不應該使用指針之前。
圖像是使用IPP分配的原始數據數組,大多數情況下我將使用IPP,此部分是以非首選格式從非託管數據到受管數據的轉換,此時需要以非IPP支持方式單獨處理數據或者首選。
我需要以下功能字節,浮點型,短的組合,並且,而不是寫所有組合明確,我寧願一些通用/模板的東西在
private static unsafe List<PixelF> GetPixels<Timg,Tmask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
風格,其中TIMG和TMask可一個(字節,短期或浮動)
現在,一個函數如下所示。
private static unsafe List<PixelF> GetPixels_FloatImg_ByteMask(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
{
List<PixelF> pixValues = new List<PixelF>();
int r, c;
int imgSrcOffset = img.LineLength - img.Width;
int imgMaskOffset = imgMask.LineLength - imgMask.Width;
float* pf_imgSrc = (float*)img.GetRoiPointer(band);
byte* pb_imgMask = (byte*)imgMask.GetRoiPointer(bandMask);
for (r = 0; r < img.Height; r++) // Loop over rows
{
for (c = 0; c < img.Width; c++) // Loop over columns
{
if (*pb_imgMask > 0)
{
pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc));
}
++pf_imgSrc;
++pb_imgMask;
}
pf_imgSrc += imgSrcOffset;
pb_imgMask += imgMaskOffset;
}
return pixValues;
}
編輯** 下面是我想怎麼做:
private static unsafe List<PixelF> GetPixels<Timg, Tmask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
{
List<PixelF> pixValues = new List<PixelF>();
int r, c;
int imgSrcOffset = img.LineLength - img.Width;
int imgMaskOffset = imgMask.LineLength - imgMask.Width;
Timg* pf_imgSrc = (Timg*)img.GetRoiPointer(band);
Tmask* pb_imgMask = (Tmask*)imgMask.GetRoiPointer(bandMask);
for (r = 0; r < img.Height; r++) // Loop over rows
{
for (c = 0; c < img.Width; c++) // Loop over columns
{
if (*pb_imgMask > 0)
{
pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc));
}
++pf_imgSrc;
++pb_imgMask;
}
pf_imgSrc += imgSrcOffset;
pb_imgMask += imgMaskOffset;
}
return pixValues;
}
我希望我能做到這一點在C++作爲模板,但有可能在C#中
編輯***
正如發明者指出的,只是試圖做
private static unsafe GetPixels_ByteImg_FloatMask<TImg, TMask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
where TImg : struct where TMask : struct
{
TImg* pb_imgSrc = (TImg*)img.GetRoiPointer(band);
}
給出了錯誤 (不能走的地址,獲取的大小,或指針聲明爲管理型)。
編輯* * Basicaly,我需要知道的是大小指針(字節,短,浮點數)和當然,它必須正確地轉換爲浮動後,
是,原始類型可以用作通用的類型的參數。例如列表是常見的。 –
這聽起來像是當你說「原始類型」時,你的意思是價值類型。如果是這樣,那麼你遇到了什麼問題?泛型適用於值類型和引用類型(你甚至可以將泛型限制在它只能是一個或另一個的地方)。 –
但是,你想要做的不是通用的。當然,泛型類型可以是原始值類型,除非您應用約束,它們也可以是任何其他類型。 – Jodrell