001
31.10.2011, 13:59 Uhr
ao
(Operator)
|
MUSS auf Templates verzichtet werden? Oder willst du nur, dass das nicht sichtbar ist?
Spontan fällt mir sowas hier ein. Ist vermutlich ziemlich dreckig, aber so als Anregung, wie es gehen könnte ...
Soll es in C sein (Templates nicht möglich), dann müsste man das irgendwie mit dem Preprocessor hinkriegen. Ist aber wohl noch dreckiger ...
C++: |
//
#include "stdafx.h"
enum FILTER_RESULT { OK , ERROR };
enum PIXEL_TYPE { FLOAT , CHAR , INT };
PIXEL_TYPE GetPixelType (const void * imageData) { return INT; // den Datentyp irgendwie ausbaldowern }
// Diese Template-Funktion realisiert den Filter // für den gegebenen Datentyp T. template <typename T> FILTER_RESULT typedFilter (T * outPixels, const T * inPixels) { *outPixels = *inPixels * 2; // hier wird die Rechnerei hingeschrieben return OK; }
// Dieser Wrapper ermittelt den Pixeltyp und instanziert // die dazu passende Filterfunktion (typedFilter) und ruft sie auf. FILTER_RESULT filter ( void * outData // Generische Zeiger , const void * inData // auf die Daten // hier kommen noch in irgendeiner Form die Abmessungen des Bildes // sowie Parameter für den Filter ) { FILTER_RESULT result = ERROR;
PIXEL_TYPE type = GetPixelType (inData); switch (type) { case FLOAT: { float * inPixels = (float *) inData; // Typisierte Zeiger auf die Daten. Um dem Compiler float * outPixels = (float *) outData; // zu zeigen, welche Instanzierung wir wollen.
result = typedFilter (inPixels, outPixels); // Template-Funktion instanzieren für float-Daten } break;
case INT: { int * inPixels = (int *) inData; int * outPixels = (int *) outData;
result = typedFilter (inPixels, outPixels); // Template-Funktion instanzieren für int-Daten } break;
case CHAR: { char * inPixels = (char *) inData; char * outPixels = (char *) outData;
result = typedFilter (inPixels, outPixels); // Template-Funktion instanzieren für char-Daten } break;
} return result; }
int _tmain(int argc, _TCHAR* argv[]) {
// Beispiel: Float-Daten. // Das "Bild" besteht aus einem Pixel und wird in-Place geändert. float f = 1; typedFilter (&f, &f);
// Dasselbe für int-Daten int i = 1; typedFilter (&i, &i);
// ... und für char-Daten. char c = 1; typedFilter (&c, &c); return 0; }
|
Dieser Post wurde am 31.10.2011 um 14:01 Uhr von ao editiert. |