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 :

Fonction qui retourne n'importe quel type


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut Fonction qui retourne n'importe quel type
    Bonjour,

    Est-il possible de créer une fonction dans une classe normale qui retourne n'importe quel type ?
    je ne suis pas sur de la syntaxe:

    J'avais pensé aux templates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    pour la déclaration
    template <typename T>
    T mafonction();
     
    pour la définition
    template <typenameT>
    T mafonction()
    {
       ......
       return i; //i étant un int par exemple
    }
    :

    au niveau utilisation ce serais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int j = mafonction<int>();
    c'est bien cela ?

    Merci de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par andromeda Voir le message
    Est-il possible de créer une fonction dans une classe normale qui retourne n'importe quel type ?
    Hello,

    Possible via template, attention, pas de définition en 2 temps avec les templates par contre.

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Avec C++11, ta fonction peut retourner un type auto. Petit exemple ici. Sinon comme l'a dit Iradrille, les templates existent aussi.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    Qu'est ce que tu veux dire quand tu dis pas de définition en 2 temps avec les templates ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Par défaut
    Pour la définition en deux temps tu veux dire qu'il faut déclarer la méthode et la définition de la méthode dans le meme fichier (par ex: fichier include) je suppose ?

    J'ai fait quelques test avec une methode template mais j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	Error	1	error C2783: 'T maClasse::maMethode(HWND,UINT,WPARAM,LPARAM)' : could not deduce template argument for 'T'	\mysource.cpp	590
    soit cela viens de la declaration et de la definition de la methode template qui n'est pas bonne ou bien le compilateur s'attend a avoir au moins un parametre avec T dans la méthode.

    Avez vous une idée ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par imperio Voir le message
    Avec C++11, ta fonction peut retourner un type auto. Petit exemple ici. Sinon comme l'a dit Iradrille, les templates existent aussi.
    Une fonction ne peut pas retourner auto. Tu confond avec la nouvelle syntaxe qui permet d'écrire le type de retour après. On passe de TypeRetour func(); à auto func() -> TypeRetour;.

    andromeda, pas possible de t'aider sans voir plus de code.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Une fonction ne peut pas retourner auto.
    Et si, une fonction peut aussi retourner auto. Mais il faut le coupler avec le qualifier decltype. Regardes ici par exemple.
    Si tu souhaites en avoir le coeur net, tu peux tester le code suivant sur un compilo qui supporte c++11:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <typeinfo>
     
    template<class T, class U>
    auto add(T t, U u) -> decltype(t + u) // the return type of add is the type of operator+(T,U)
    {
    	return t + u;
    }
     
    int main()
    {
    	auto a = add(1, 1.2);
    	std::cout << "type of a: " << typeid(a).name() << '\n';
    }
    @andromeda: c'est bien de montrer le message d'erreur - et ce n'est pas du cynisme; beaucoup ne le font pas - mais si tu ne nous donne pas aussi le code auquel il correspond, on ne peut pas deviner d'où vient le problème.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    rod >> C'est exactement ce que jblecanard dit. On ne retourne pas auto, c'est (dans ce cas) juste une syntaxe pour retarder la déclaration du type de retour.

    Ca revient a dire au compilateur.
    Je sais que tu attends un type ici, je vais te donner un joker pour le moment (auto) et le vrai type arrive dans (le truc juste après ->). Et si je respecte pas ce contrat, tu as le droit de m'insulter car le programme sera mal formé.
    andromeda >> Ton erreur vient tu fais que le compilateur n'a pas pu déduire le type template. Il faut bien comprendre que si un type template n'est pas en paramètre dune fonction, le compilateur n'a aucune moyen de le deviner magiquement. Il faut donc l'ecrire explicitement et pour une fonction membre, ca marche comme ca :

    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
    #include <iostream>
    #include <string>
    using namespace std;
     
    struct A
    {
        template <class T> T foo(int)
        {
            return T();
        }    
    };
    int main() {
        A a;
        std::string s=a.foo<std::string>(5);
     
        //marche aussi
        int i=a.foo<decltype(i)>(5);
     
         double d=a.foo<int>(5);
     
         return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. Fonction qui retourne un type inconnu (templates?)
    Par B65AcR dans le forum Débuter
    Réponses: 5
    Dernier message: 02/03/2014, 14h07
  3. Fonction qui retourne un type anonyme
    Par Pelote2012 dans le forum Entity Framework
    Réponses: 1
    Dernier message: 14/10/2011, 12h24
  4. fonction qui retourne plusieurs types
    Par nouvelinscrit dans le forum C#
    Réponses: 4
    Dernier message: 19/07/2010, 16h00
  5. Réponses: 2
    Dernier message: 16/03/2009, 14h37

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