Fonctions avec paramètres à types dynamiques
Bonjour à tous,
Je bloque sur un problème qui me dépasse pour le moment ! Le voici : je dois faire une interface pour travailler avec des algorithmes ayant le même but, mais des interfaces et des méthodes très différentes.
J'ai décidé de faire une interface générale pour ces algorithmes avec une classe virtuelle pure à hériter pour chaque type d'algorithme.
Le problème de ces algorithmes est qu'ils ont chacun un panel de paramètres qui n'ont rien à voir les uns avec les autres selon le type de l'algorithme.
J'aimerai donc que dans l'interface générale je puisse proposer une fonction afin de modifier le paramètre d'un algorithme, et donc, que selon le type d'algorithme et de paramètre à changer, la valeur ait un type en adéquation.
J'ai donc, par exemple, pour un type d'algorithme concret, que nous appellerons SD, implémenté cette interface :
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
| #define BSPF_ALGORITHM_SIGMA_DELTA_SD_PARAMETERS_SD_PARAM_TYPE(PARAM,TYPE) \
template <> struct SDParamType<SDParameters::PARAM> { \
typedef TYPE Type;\
};
namespace BSPF_ALGORITHM {
class SDParameters {
public:
enum ID {
AMP_FACTOR,
MAX_VARIANCE,
MIN_VARIANCE
};
};
template <SDParameters::ID T> struct SDParamType;
BSPF_ALGORITHM_SIGMA_DELTA_SD_PARAMETERS_SD_PARAM_TYPE(
AMP_FACTOR,
uint32_t
)
BSPF_ALGORITHM_SIGMA_DELTA_SD_PARAMETERS_SD_PARAM_TYPE(
MAX_VARIANCE,
uint32_t
)
BSPF_ALGORITHM_SIGMA_DELTA_SD_PARAMETERS_SD_PARAM_TYPE(
MIN_VARIANCE,
uint32_t
)
} |
on a donc une énumération avec les différents paramètres d'un algorithme de type SD, et une structure SDParamType qui "renvoie" le type de chaque paramètre.
Voici l'interface générale que j'essaye d'implémenter :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| namespace BSPF_ALGORITHM {
template <class Parameters, class ParamType> class Algorithm {
public:
template <typename T>
Algorithm(BSPF_IMAGE::Image<T> image);
virtual ~Algorithm();
template <typename Parameters::ID id>
void setParameter(typename ParamType<id>::Type value);
};
} |
Seulement, g++ renvoies l'erreur suivante (correspondant à la méthode setParameter) :
Code:
1 2 3
| Algorithm.h:16:34: erreur: expected nested-name-specifier before ‘ParamType’
Algorithm.h:16:34: erreur: expected ‘(’ before ‘ParamType’
Algorithm.h:16:59: erreur: variable or field ‘setParameter’ declared void |
Si je transforme :
Code:
1 2
| template <typename Parameters::ID id>
void setParameter(typename ParamType<id>::Type value); |
en :
Code:
1 2
| template <typename Parameters::ID id>
void setParameter(typename ParamType::Type value); |
évidemment ça compile, mais ça ne va pas. Je ne sais pas comment venir à bout de ce problème.
Merci !
Benjamin