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...
Des suggestions??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>); }
Partager