obtenir un type à partir de variables pour instancier une classe template
bonjour
alors voila, j'ai trois variables.
- enum{LUMINANCE, RGB} PixelType;
- enum{SIGNED, UNSIGNED, RATIONAL} PixelComponentType;
- unsigned int nb_bits_per_pixels;
Le type d'une image dépend de ces trois variables.
J'ai aussi ces quelques classes :
- Image<T>;
- ImageLoader<T>;
- ImageFilter1<T1, T2>;
- ImageFilter2<T1, T2>;
- ...
- ImageFilterN<T1, T2>
T, T1, et T2 correspondent au type des pixels de l'image, les valeurs possibles sont par ex. float, double, unsigned char, ..., RGBPixel<float>, ...
A savoir que le type des pixels de l'image dépends des trois variables décrites précedemment. Durant l'exécution du programme, ces variables peuvent varier du tout au tout, et fréquemment; et je dois créer des instances de Image<T>, ImageLoader<T>, et ImageFilter<T1, T2> (T1 et T2 sont différents).
Afin de simplifier le code et de permettre une meilleure maintenance de ce code, quel est la meilleur façon d'obtenir le type T à partir de trois variables lors de l'instanciation ?
J'avais commencé comme cela, en testant les variables et utilisant le préprocesseur (pour éviter de recopier tout le code à chaque fois), mais cela devient vite très très exhaustif... il faut tester toutes les valeurs possibles à chaque fois...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
#define RETURN_LOADED_IMAGE(IMAGE_TYPE1) \
{ \
ImageFileReader< Image< IMAGE_TYPE1 > >* p_file_reader(ImageFileReader< Image< IMAGE_TYPE1 > >::New()); \
p_file_reader->SetFileName(url); \
p_file_reader->Update(); \
return new ItkImage< IMAGE_TYPE1 >(p_file_reader->GetOutput()); \
}
.....
.....
.....
// Luminance Float
if (aPixelType == Image::LUMINANCE && aPixelComponentType == Image::RATIONAL && bitsPerPixel->getValue() == sizeof(float) * 8)
{
RETURN_LOADED_IMAGE(float);
}
// Luminance Double
else if (aPixelType == Image::LUMINANCE && aPixelComponentType == Image::RATIONAL && bitsPerPixel->getValue() == sizeof(double) * 8)
{
RETURN_LOADED_IMAGE(double);
}
.....
.....
// RGB Float
else if (aPixelType == Image::RGB && aPixelComponentType == Image::RATIONAL && bitsPerPixel->getValue() == sizeof(float) * 24)
{
RETURN_LOADED_IMAGE(RGBPixel<float>);
}
// RGB Double
else if (aPixelType == Image::RGB && aPixelComponentType == Image::RATIONAL && bitsPerPixel->getValue() == sizeof(double) * 24)
{
RETURN_LOADED_IMAGE(RGBPixel<double>);
} |
Des suggestions??