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++

  1. #21
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    C'est hyper spécifique à certains templates, et oui c'est "pratique". Mais ça me fait beaucoup penser à "juste" un 3° paramètre template qui définirait le type de retour. Donc c'est une petite évolution, mais certainement pas une révolution. (comme j'ai l'impression que certains voient en ça LE nouveau mot-clé messie)
    Mais tu as toujours le decltype alors que j'ai lu plus haut que ça parlait de le supprimer ?
    Et comment serait déterminé le type de Matrice * Vector ? Il faut avoir déclarer un operator* entre les 2 ?

  2. #22
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Bousk Voir le message
    C'est hyper spécifique à certains templates, et oui c'est "pratique". Mais ça me fait beaucoup penser à "juste" un 3° paramètre template qui définirait le type de retour. Donc c'est une petite évolution, mais certainement pas une révolution. (comme j'ai l'impression que certains voient en ça LE nouveau mot-clé messie)
    Mais tu as toujours le decltype alors que j'ai lu plus haut que ça parlait de le supprimer ?
    C’est différent d’un 3ème paramètre template, car il n’y a pas besoin de le préciser à l’appel. En ce sens, tu gagnes en flexibilité (le but des templates, après tout). C’est clairement utile uniquement dans des contextes de métaprogrammation, pour définir des opérations génériques sur des types distincts interagissant entre eux (je pense notamment aux expression template, etc, où à mon avis il y a des contextes d’utilisation clairs).

    Pour le decltype, je ne vois pas trop comment tu peux le supprimer (il me semble que ce n’est autorisé que pour les lambdas).

    Et comment serait déterminé le type de Matrice * Vector ? Il faut avoir déclarer un operator* entre les 2 ?
    Si l’opérateur n’existe pas, de toute façon, ton template ne fonctionnera pas pour ces types.

    en voulant trouver un exemple d’utilité, j’ai testé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename T>
    T sum(T arg)
    {
        return arg;
    }
     
    template<typename T, typename... Args>
    auto sum(T arg, Args... args) -> decltype(arg + sum(args...))
    {
       return arg + sum(args...);
    }
    malheureusement, ça ne compile pas… et je me demande à quel point le compilateur (mais gcc et clang font de même) est en droit de me refuser ce code.

  3. #23
    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
    Points : 3 159
    Points
    3 159
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    « auto » comme type de retour permet de faire des choses comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T1, typename T2>
    auto DeuxXPlusY(T1 const& x, T2 const& y) -> decltype(2*x+y)
    {
        return 2*x + y;
    }
    Ca a déjà été dit, mais j'en remet une couche, c'est important car ça peut induire des débutants en erreur. auto n'est PAS le type de retour de la fonction. Le type de retour est decltype(2*x+y).

  4. #24
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    C’est différent d’un 3ème paramètre template, car il n’y a pas besoin de le préciser à l’appel.
    Dans ce cas là, je pense que le compilateur devrait être capable de le déterminer. Les paramètres template n'ont pas forcément besoin d'être explicités, ils peuvent être déterminés en fonction du contexte également.
    Si c'est pour remplacer un template par un mot-clé auto, ça fait encore plus gadget de mon point de vue.

    Ca a déjà été dit, mais j'en remet une couche, c'est important car ça peut induire des débutants en erreur. auto n'est PAS le type de retour de la fonction. Le type de retour est decltype(2*x+y).
    C++14 veut supprimer ce decltype

  5. #25
    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
    Bousk >> En supprimant decltype on laisse le compilateur faire une inférence du type de retour, mais ce dernier n'est aucunement auto

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

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

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