IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Fonctions avec paramètres à types dynamiques


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut 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 : 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
    #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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          template <typename Parameters::ID id>
          void setParameter(typename ParamType<id>::Type value);
    en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par benlaug Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename Parameters::ID id>
    Cette ligne est un nom sens.

    Pose-toi la question suivante : que représentent respectivement Parameters::ID et id ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Citation Envoyé par oodini Voir le message
    Cette ligne est un nom sens.

    Pose-toi la question suivante : que représentent respectivement Parameters::ID et id ?
    typename Parameters::ID est un type extrait d'un typedef d'une classe statique. id est une constante de ce type.

    En gros ça n'a rien de bien différent d'une construction tu type template <int a>. Je ne pense pas que le problème vienne de là étant donné que j'ai utilisé souvent ce genre de constructions et qu'elle m'a même été conseillée sur ce même forum.

    Moi ce que je comprends, c'est que le compilateur refuse de voir la classe ParamType comme un template. Je ne sais pas comment corriger ce comportement.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par benlaug Voir le message
    En gros ça n'a rien de bien différent d'une construction tu type template <int a>.
    Ah si, c'est bien différent. <int a> est comparable à <typename T>, pas à <typename T id>.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour

    Là tu lui dis (dans la déclaration de ta classe) que ParamType est un type, or toi tu voudrais lui dire que c'est un TTP (template template parameter, ou presque). La syntaxe étant template<class> class ParamType.

    La gestion des paramètre template entier est assez lourd, pour s'en affranchir on peut les transformer en type, c'est ce qu'on peut faire avec std::integral_constant.

    En utilisante les std::integral_constant, tu pourra directement ùarquer template<class ID>, après le type et la valeur sont codé dans le type std::integral_constant que tu lui passera.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Citation Envoyé par oodini Voir le message
    Ah si, c'est bien différent. <int a> est comparable à <typename T>, pas à <typename T id>.
    Euh, non . Dans <int a> a est une constante entière de type int, dans <typename T>, T est un type lui-même. Dans, <typename Parameters::ID id>, typename Parameters::ID est un type et id est le nom de la constante de ce type.

    Citation Envoyé par Flob90 Voir le message
    Bonjour

    Là tu lui dis (dans la déclaration de ta classe) que ParamType est un type, or toi tu voudrais lui dire que c'est un TTP (template template parameter, ou presque). La syntaxe étant template<class> class ParamType.

    La gestion des paramètre template entier est assez lourd, pour s'en affranchir on peut les transformer en type, c'est ce qu'on peut faire avec std::integral_constant.

    En utilisante les std::integral_constant, tu pourra directement ùarquer template<class ID>, après le type et la valeur sont codé dans le type std::integral_constant que tu lui passera.
    Merci, je vais creuser dans cette direction et donnerai du feedback.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Là tu lui dis (dans la déclaration de ta classe) que ParamType est un type, or toi tu voudrais lui dire que c'est un TTP (template template parameter, ou presque). La syntaxe étant template<class> class ParamType.
    Ça fonctionne parfaitement, merci .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier onclick dynamiquement pour passer une fonction avec paramètres
    Par denisosteo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/01/2014, 12h38
  2. Fonction avec paramètre optionnel
    Par Damien2007 dans le forum ASP
    Réponses: 1
    Dernier message: 27/06/2007, 15h49
  3. Fonction avec paramètre illimité
    Par Kiboumz dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2006, 17h58
  4. [Function]Appel de fonction avec paramètre
    Par julienOriano dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2006, 07h48
  5. Réponses: 4
    Dernier message: 11/09/2005, 01h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo