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 :

surcharge de méthode par valeur de retour


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut surcharge de méthode par valeur de retour
    Je sais, le C++ ne le permet pas.

    Ce code n'est pas valide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct query
    {
    	long get()
    		{ return 5l; }
    	std::string get()
    		{ return "abc"; }
    };
    Comment contourner le problème sans passer par un variant géré au runtime.

    Voici une solution:
    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
    struct query;
    struct my_variant
    {
    	query & f_q;
    	my_variant(query & q) : f_q(q) {}
    	template<typename T>
    	operator T()
    	{
    		T t;
    		f_q.get(t);
    		return t;
    	}
    };
     
    struct query
    {
    	void get(long & l)
    		{ l=5l; }
    	void get(std::string & s)
    		{ s="abc"; }
    	my_variant get()
    	{
    		return my_variant(*this);
    	}
    };
     
    void main()
    {
    	query q;
    	long i = q.get();
    	std::string s = q.get();
    }
    Si quelqu'un a mieux je suis preneur

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et quelle est ta question?

    Plus important, pourquoi te la poses-tu? Le savoir nous permettra probablement de te dire comment t'en passer.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Oui, désolé, j'ai malencontreusement cliqué sur Envoyer avant d'avoir fini le post

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Un get template, non défini, et spécialisé pour get<long> et get<string>?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct query {
    template <typename T>
    T get();
    };
     
    template <>
    long query::get<long>() {return 5l;}
     
    template <>
    std::string query::get<std::string>() {return "string";}
     
    int main() {
    std::cout << query().get<std::string>() << std::endl;
    }

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Je souhaite vraiment conserver cette écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get();
    	s = q.get();
    }
    Si c'est pour écrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get<long>();
    	s = q.get<std::string>();
    }
    Je préfère alors ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get_long();
    	s = q.get_string();
    }

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Alors tu ne peux vraiment pas comme ca.

    Ou faire preuve d'astuce et retourner un Bidule™ qui se convertit tout seul dans le bon type.

    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
    struct query_result {
        explicit operator long () const { return 5l; }
        explicit operator std::string () const { return "string"; }
    };
     
    struct query {
        query_result get() const {return query_result();}
    };
     
    int main() {
    	long l;
    	std::string s;
    	query q;
    	l = q.get();
    	s = q.get();
    }
    En version plus constructive:
    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
     struct query;
    struct query_result {
        query const& q;
     
        template <typename T>
        explicit operator T () const { return q.get<T>(); }
    };
     
    struct query {
        query_result get() const {return {*this};}
     
        template <typename T>
        T get() const;
    };
    //les spécialisations...
     
    int main() {
    	long l;
    	std::string s;
    	query q;
    	l = q.get();
    	s = q.get();
    }

  7. #7
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par camboui Voir le message
    Je souhaite vraiment conserver cette écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get();
    	s = q.get();
    }
    Si c'est pour écrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get<long>();
    	s = q.get<std::string>();
    }
    Je préfère alors ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void main()
    {
    	long l;
    	std::string s;
    	query q;
    	l = q.get_long();
    	s = q.get_string();
    }
    Donc le but est seulement esthétique ?

    L'avantage de la solution avec des templates, c'est que tu peux faire du polymorphisme paramétré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    void foo(const query& q) {
    	T var1 = q.get<T>();
    	T var2 = q.get<T>();
    	...
    }
    ou du polymorphisme ad hoc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef long TypeQuiPourraChanger;
    void bar(const query& q) {
    	TypeQuiPourraChanger var1 = q.get<TypeQuiPourraChanger>();
    	TypeQuiPourraChanger var2 = q.get<TypeQuiPourraChanger>();
    	...
    }
    ce que ne permettent pas les écritures q.get_long() et q.get_string().

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/02/2011, 16h39
  2. Exception et méthode avec valeur de retour
    Par gmonta31 dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2008, 12h54
  3. précision sur la valeur de retour de la méthode GetDirectories
    Par piotrr dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/06/2007, 14h07
  4. Réponses: 5
    Dernier message: 10/01/2007, 15h37
  5. Réponses: 3
    Dernier message: 06/10/2005, 15h21

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