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

Boost C++ Discussion :

auto vs result_of


Sujet :

Boost C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut auto vs result_of
    Bonjour,

    Avec la venu du mot clef auto, boost::result_of a t-il encore un intérêt ?

    Merci

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Son utilisation première est de récupérer un type de retour d'un objet Fonction Polymorphe dans un contexte générique. Elle reste valide.

    boost::result_of est de toute façon la même chose que std::result_of.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Alors que auto sert à obtenir le type d'une expression à partir de son initialisation.

    Les deux outils n'ont pas le même objetif, l'un sert à déterminer un type de retour d'un foncteur (dans le sens le plus large), l'autre à simplifier la création d'objet (il arrive que déterminer le type soit complexe et long à écrire).

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ok, d'ailleurs ça m'a fait découvrir un truc :

    on passe infiné l'instance d'une classe et non uniquement un type à résult_of. j'étais persuadé que les paramètres template se limiter à des types mais pas à type et/ou intance d'une classe...

    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
     
    struct G {
    	bool operator() () const	{std::cout<<"foo"<<"\n"; }
    };
     
    template<typename Q> struct F{ typedef Q type; };
     
    struct is_positive_number {
      bool operator()(int x) { return 0 < x; }
    }; 
    int main()
    {  
    	typedef boost::result_of< is_positive_number() >::type result_type;
     
    	F<G()>::type typer;	
    	typer(); //erreur linkage, de même que F<G()>:type() ne compile pas ?!
     
    	std::cin.ignore();  
    	return boost::exit_success;
    }
    si je rajoute un consctuteur à G prenant un int, et que je le passe à F<G(3)> ça ne compile plus...

    QUelqu'un aurait une précsion/explication concernant ce point?

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Non, ca ne fonctionne pas comme ca. Pour comprendre voici à quoi pourrait ressembler result_of :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class Fn, class... ArgTypes>
    struct result_of;
     
    template<class Fn, class... ArgTypes>
    struct result_of<Fn(ArgTypes...)>
    { typedef decltype(std::declval<Fn>()(std::declval<ArgTypes>()...)) type; };
    Les declval permettent de "faire semblant" de passer une variable du type indiqué en template, et decltype permet d'évaluer le type de l'expression entre paramètre, ici ca donne le type de retour du foncteur.

    Celui de boost date d'avant l'introduction de decltype et declval, il fonctionne différement, mais l'idée doit être la même. (regardes le code de boost si ca t'interesse )

    Donc c'est bien des types que tu passes à result_of et pas des instances, c'est juste la syntaxe qui permet de faire ressemble (à part que c'est pas le type de retour mais le nom du foncteur) ca à des signatures de fonctions (et si tu mets pas de paramètres ca ressemble à une instanciation, mais ca n'en est pas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct A { int operator()(int) {return 1;} };
     
    typedef result_of<A(int)>::type r;
    r i = r();
    std::cout << i; //affiche 0
    Compile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct A { int operator()(int) {return 1;} };
     
    typedef result_of<A()>::type r;
    r i = r();
    std::cout << i;
    Ne compile pas

    Les paramètres templates sont forcément des types (template au besoin), ou des entiers (size_t et void* assez courrant).

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    donc l'idée c'est qu'une signature de fonction c'est un type ? pourtant dans mon exempe c'est bien le nom d'une classe que je passe,... j'ai pas compris ton post, pour moi decltype c du c1X

    EDIT:ah ou l'idée ce que le compilo voit une fonction retournant un type G et ne prenant aucun paramètre!!

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Non, j'ai dit que ca ressemble à une signature de fonction (et oui le type d'une fonction c'est sa signature), sauf qu'à la place d'indiquer le type de retour (cest ce qu'on veut, on ne peut pas l'indiquer), on indique le nom du foncteur, dans ce cas le nom de la classe : G.

    Oui, decltype c'est du C++1x, sauf que c'était juste pour te montrer à quoi pouvait ressembler reslut_of, boost fait autrement, mais ca doit être plus long.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    c'était juste pour te montrer à quoi pouvait ressembler result_of, boost fait autrement, mais ca doit être plus long.
    C'est rien de le dire

    result_of est une classe template qui prends un argument, et qui est spécialisé pour :
    * les fonctions (de 0 a 9 arguments)
    * les méthodes (de 0 à 9 arguments)
    * les foncteurs (de 0 à 9 arguments)
    * les classes qui héritent d'un foncteur classique (genre std::unary_function).

    Le tout en utilisant SFINAE de manière régulière et rigolote si je me rappelle bien, en prenant en compte les différences de comportement des compilateurs vis à vis des spécialisation partielles.

    C'est un plaisir à lire, comme code. Ca rends copain avec Visual Basic, pour tout dire.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    effectivement ça use à outrance boost preprocessor, faut s'accrocher


    c'est normal que ce code me renvoit void (sauf si je rip)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef boost::result_of<int()>::type var; //var est de type void

Discussions similaires

  1. [sgbd] Backup de tables MySQL auto, qqun sait ???
    Par Joelindien dans le forum SGBD
    Réponses: 31
    Dernier message: 26/05/2003, 17h59
  2. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05
  3. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  4. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 10h31
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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