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 :

retour d'une fonction template


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut retour d'une fonction template
    Salut à tous,

    Pour expliquer mon problème voici le code qui me pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class CBase
    {
    public:
        template <class T>
        T get(std::string str)
        {
            if (str == "un") return 42;
            if (str == "deux") return std::string("test");
        }
    }
    Lorsque je fais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CBase unTest;
    int i = inTest.get<int>("un");
    ...le code ne veut pas compiler car (dans ce cas) la conversion d'un string en int est impossible, malgré le fait que i soit un int et que la fonction get doive me retourner un int (puisque int est le parametre template)

    Y a-t-il un moyen de parvenir a faire cela ?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    une fonction ne peut pas retourner deux types différents, ce que tu veux faire n'est pas possible en C++.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Plus philosophiquement, ton problème est que tu essaies de déterminer à l'exécution (via la valeur de str) quelque chose qui doit l'être à la compilation (le type renvoyé).

  4. #4
    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 861
    Points
    11 861
    Par défaut
    Tu peux bricoler autant que tu veux sur le type de retour avec des traits par exemple, ou autres, tant que ce sera déterminé à la compilation. Là c'est à l'exécution (au moment de l'appel de get) que ça devrait trouver le type --- autrement dit impossible.

    Si tu as besoin d'une telle chose, change de façon de la voir

  5. #5
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    la conversion d'un string en int est impossible
    Impossible directement .Tu ne peut pas écrire .
    Mais tu peux passer par istringstream et par ostringstream pour passer de int<->string.

    Edit : ouais le début des étoiles . Et sans avoir flooder a mort ni dit trop de conneries(enfin je crois )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    oui cet exemple était juste là pour illustrer mon problème
    Pour ce qui est de l'utilisation, je voulais en quelque sorte un "espèce" de gestionnaire qui pourait me renvoyer une instance d'une classe ou bien d'une autre.

    CclasseA = gestionnaire.get<CclasseA>("fichier")
    ou bien
    CclasseB = gestionnaire.get<CclasseB>("fichier")

    de manière a pouvoir tout centraliser dans une seule classe et éviter d'avoir a faire
    CclasseA = IclasseA.get("fichier") et CclasseB = IclasseB.get("fichier")

  7. #7
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca ressemble a une factory.
    En effet on crée des objets sans connaitre leurs type réel.

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Puisque tu connais le type de retour que tu souhaites lorsque tu appelles la fonction, pourquoi s'embêter avec un template?
    Une simple factory devrait faire l'affaire si j'ai bien compris ton problème. Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyFactory
    {
    public:
        CclasseA CreateA(std::string nomfichier);
        CclasseB CreateB(std::string nomfichier);
    };

    edit: grilled by Davidbrcz

  9. #9
    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 861
    Points
    11 861
    Par défaut
    Sinon, n'essaye pas non plus de placer des templates partout --- cette erreur est récurrente, ne t'inquiètes pas

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Peut-être que ce que tu cherche c'est un opérateur de conversion template. Exemple :
    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
    class A
    {
    public:
        template<typename T> A(T const& x)
        {
            buffer << x;
        }
     
        template<typename T> operator T() const
        {
            T x;
            buffer >> x;
            return x;
        }
     
    private:
        std::stringstream buffer; 
    };
    permet ensuite de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A a(42.0);
    int i = a; // 42
    std::string s = a; // "42"

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Comme je supposais que c'était possible à réaliser, je trouvais plus pratique de "sélectionner" son type de retour à l'aide de <type>que d'avoir une fonction createType par type de retour.
    Mais cette solution d'usine me convient tout de même
    Merci !

    edit: @Sylvain Togni
    En quelque sorte mais mes types de retour sont des classes donc il me semble que çela ne marcherait pas (?)

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

Discussions similaires

  1. [XML][XSLT][debutant]retour d'une fonction
    Par maxvador dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 30/03/2006, 14h12
  2. recuperer en php le retour d'une fonction plsql
    Par gismoblue dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/03/2006, 16h39
  3. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  4. PL/SQL retour d'une fonction
    Par aaronw dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2005, 13h25
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

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