Méthode template intelligente
Bonjour,
Avant toutes choses, autant préciser que je n'y connais pas grand chose en prog et que ce que j souhaite est surement tordu ou irréalisable mais bon, j'y crois :)
Alors voila je souhaiterais avoir une méthode template dans une classe qui me renvoie une valeur d'un certain type, ce type étant définie par un attribut interne de la classe (un entier qui prend plusieurs valeurs ...)
Un peu de code sera sûrement plus parlant (j'espère :roll:)
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
// en réalité ces définitions sont ailleurs, je les rajoute ici pour compréhension
#define VTK_DOUBLE 1
#define VTK_FLOAT 2
#define VTK_INT 3
class MaClasseA
{
MaClasseA(void );
template <typename T> T GetData(const int index);
void *ptr;
int type;
}
void MaClasseA::MaClasseA(void)
{
// ImageData est une instance de la classe vtkImageData de la librairie VTK et cette méthode renvoie un pointeur de type void * qui pointe vers un grand tableau 1D.
// Le souci est que je ne peux pas savoir à l'avance de quel type seront les données, cela dépend des images.
// Les données sont chargées ailleurs et j'ai simplifié le code pour compréhension, en tout cas j'ai accès à l'instance ImageData depuis le constructeur de cette classe.
ptr=ImageData->GetDataPointer();
// renvoi VTK_DOUBLE ou VTK_FLOAT ou autres
type=ImageData->GetScalarType();
}
template <typename T> T MaClasseA::GetData(const int index)
{
switch (type)
{
case VTK_DOUBLE :
return static_cast<double *>(ptr)[index];
break;
case VTK_FLOAT :
return static_cast<float *>(ptr)[index];
break;
default :
break;
}
}
class MaClasseB : public MaClasseA
{
MaClasseB();
void MaMethodeAuPif(void);
}
void MaClasseB::MaClasseB(void){;}
void MaClasseB::MaMethodeAuPif(void)
{
cout<<"Valeur du voxel 150 "<<GetData(50)<<endl;
} |
Tout le problème se situe sur cette dernière méthode qui ne fonctionne pas dans l'état (dommage !). Et je ne veux pas avoir à faire ce qui suit sans quoi l'intérêt de la méthode template est plus que limité !
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
void MaClasseB::MaMethodeAuPif(void)
{
switch (InstanceClasseA->GetType())
{
case VTK_DOUBLE :
cout<<"Valeur du voxel 150 "<<GetData<double>(50)<<endl;
break;
case VTK_FLOAT :
cout<<"Valeur du voxel 150 "<<GetData<float>(50)<<endl;
break;
default :
break;
}
} |
Est ce qu'il existe un moyen de récupérer ma valeur avec une seule fonction, sans passer par le switch case ? Ca serait pas mal car je vais avoir énormément de méthodes du type MaMethodeAuPif dans différentes classes qui héritent de MaClasseA, et je voudrais éviter le switch avec les 15 types à chaque fois ...
La solution du pb ne doit pas être très loin de cette section de la FAQ C++, mais je ne vois pas comment faire.
http://cpp.developpez.com/faq/cpp/?p...TES_parametres
Voila merci d'avance et redites si c'est incompréhensible ou autres
Bonne soirée et merci pour votre forum riche en information
Simon