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 :

Classes, Operateurs et Templates. Pas possible ?


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Par défaut Classes, Operateurs et Templates. Pas possible ?
    Bonjour à tous,

    Voilà, j'ai un gros soucis de C++, qui vise les plus experts d'entre vous, même si le principe est simple.
    Je voudrais rendre un operateur d'une classe utilisable sans qu'il soit "auto-défini".
    Un exemple sera plus simple à comprendre :
    Code C : 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
    template<typename T>
    class XX
    {
      public:
        XX() {}
        T* operator()() { return new T; }
    };
     
    class YY
    {
      public:
        YY() {}	
        template<typename T>
        T* operator()() { return new T; }
    };
     
    int main()
    {
      int* x = XX<int>()();
      int* y = YY()<int>();
     
      return 0;
    }

    Donc, ici, la classe XX est utilisable tel quel pour remplir la variable x.
    Par contre, ça ne m'interesse pas, et je voudrais pouvoir utiliser la surcharge par template uniquement sur la fonction (et non sur toute la classe), c'est à dire, la forme de YY.

    Il n'y a pas de soucis avec la définition de classe, par contre, un appel direct de la forme ci-dessus ne compile même pas. Cette syntaxe fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* y = YY().operator()<int>();
    Mais je perd l'intérêt de l'opérateur.... Quel syntaxe utiliser pour rendre cela possible ?

    Merci.
    Snark.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* y = YY().operator()<int>();
    Est ici la seule syntaxe possible.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne vois pas franchement mieux que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int * const IntTag = NULL;
    double * const DoubleTag = NULL;
     
    class YY
    {
      public:
        YY() {}	
        template<typename T>
        T* operator(T *tag)() { return new T; }
    };
     
    int* y = YY()(IntTag);
    Ou alors abandonner la classe YY et l'opérateur () pour avoir une simple fonction template YY.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Par défaut
    Ha zut, bon, ben, dommage...

    Je ne peux pas utiliser de fonction toute bête (enfin, c'est surtout une histoire de lisibilité de code au final). En faîte, mon exemple est mal choisi, car ce qui m'intéresse, c'est surtout la récupération de l'opérateur [].

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En général, c'est la technique fournie par JolyLoic qui est employé : tu rajoutes un paramètre supplémentaire de type template (non utilisé) qui sert au compilateur à déterminer quelle surcharge de template il doit utiliser/instancier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class YY
    {
      public:
        YY() {}	
        template<typename T>
           T* operator[](T const& ) { return new T; }
    }
     
    ...
    YY()[int()];

Discussions similaires

  1. InvokeAndWait -> Pas possible depuis EDT ?
    Par ypicman dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 24/02/2006, 12h22
  2. Réponses: 1
    Dernier message: 20/12/2005, 17h51
  3. Ma classe fille n'hérite pas de sa classe mère
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2005, 12h49
  4. Réponses: 3
    Dernier message: 15/10/2004, 19h41
  5. Les classes ne s'affichent pas
    Par karl3i dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 14h52

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