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

C++ Discussion :

Problème de foncteur de fonction membre


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Problème de foncteur de fonction membre
    Bonjour à tous,

    J'essaye de faire un foncteur pour accéder aux propriétés de ma classe.

    Voici la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    class CData
    {
    public:
         void IProperty* GetProperty(const std::string& sName);
    }
    Voici le foncteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class T>
    class CDataPropertyFunctor
    {
    public :
        typedef typename IProperty* (T::*DataPropFunc)(const std::string&);
        CDataPropertyFunctor(DataPropFunc pFunc) : m_pFunc(pFunc) {}
        IProperty* Execute(CData<T>* tData, const std::string& sName) {return tData->pFunc(sName);}
    private :
        DataPropFunc m_pFunc;
    }
    Jusqu'ici tou va bien.

    Maintenant j'aimerai stocker une liste de ces foncteurs et ça se complique étant donné que cette liste contiendra plusieurs foncteurs agissant sur des données différentes, donc il me faut un foncteur de base pour éliminer le template.

    Mais dans une méthode virtuelle, on ne peux pas spécifier de template. je ne peux donc pas faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class IDataPropertyFunctor
    {
    public:
       virtual template<class T> IProperty* Execute(CData<T>* tData, const std::string& sName) = 0;
    }
    J'ai bien une solution, le fait une interface IData, puis mon CData<T> dérive de IData, et dans mon foncteur je travaille avec l'interface.

    Mais bon, j'aimerai pouvoir m'en passer s'il y a une autre solution.

    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tout d'abord : un foncteur est une structure ou classe qui définit un opérateur (), pour l'appeler comme si c'était une fonction.

    Ensuite, le mieux est de rajouter une "interface" (classe abstraite) je pense. C'est la solution qui semble la plus légère.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/12/2009, 00h45
  2. Problème d'adresse d'une fonction membre
    Par ens-lyon dans le forum Débuter
    Réponses: 1
    Dernier message: 11/09/2009, 10h05
  3. Problème de spécialisation de fonction template membre
    Par Davidbrcz dans le forum Langage
    Réponses: 4
    Dernier message: 29/12/2007, 20h01
  4. Problème de spécialisation de fonction membres template
    Par ludovic.barrillie dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2007, 08h44
  5. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36

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