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 :

result_of et functor


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 result_of et functor
    Bonjour,

    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
     
    #include <functional> 
     
    struct Func{
     
    	bool operator () () const
    	{
    		return true;
    	}
    };
     
    int main()
    { 	  	 
    	static_assert( std::is_void< std::result_of<Func()>::type >::value == true , "bad" ); //assertion valide
     
    	system("pause");
    }
    Pourquoi result_of<Func()> est évalué comme étant de type void ?
    quand on pase Func(), le compilo comprend quoi ?

    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
    Par définition result_of<F()> est void quelque soit F

  3. #3
    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
    Citation Envoyé par Joel F Voir le message
    Par définition result_of<F()> est void quelque soit F
    ça représente quoi <F()>, je pensais que c'était uen fonction qui renvoyer un F et qui ne prenait aucun arguement, a priori c'est pas le cas vu qu'ici Func est une classe et que ça compile, donc F() represente quoi ?

  4. #4
    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
    Bonsoir.

    Je pense que tu te mérpends sur le fonctionnement de static_assert :
    If the value of the expression when so converted is true, the declaration has no effect. Otherwise, the program is ill-formed
    (n3126, section 7, paragraphe 4).
    Dans notre cas, le programme est invalide (tu recois le message "bad" à la compilation), ce qui signification que l'assertion est fausse, donc le type n'est pas void.

    Tu peux le tester en essayant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result_of<Func()>::type b = true;
    Qui ne devrait pas poser de problème à la compilation (ca prouve juste que le type bool est convertible en result_of<Func()>::type, donc en particulier que ce n'est pas void).

    Pour le fonctionnement, c'est le mecanisme des templates qui permet ceci. Quand le compialteur voit l'expression template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::result_of<Func()>::type
    Il essay d'instancier la classe template std::result_of avec les paramètre qui lui sont donnés. Or la définition de std::result_of est (ou plutôt peut être) :
    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; };
    Il reconnait dans cette définition, un motif avec lequel il peut matcher (faire correspondre) les paramètres. Ce qui permet d'instancier la classe et de récupérer le typedef type.

    Ce qui permet de reconnaitre ce motif (car il faut nécessairement que les paramètres templates soit des types (*)), c'est que Fn(ArgTypes...), est le type d'une fonction, même si, quand on l'utilise, ca ne correspond pas à une fonction, on n'utilise juste la syntaxe.

    (*) Je simplifie, il y a d'autre possibilité, cf norme ou autre.

  5. #5
    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
    Merci pour ta réponse détaillée.
    Cependant cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::result_of<Func()>::type b = true;
    me renvoie

    error C2182: 'b'*: utilisation non conforme du type 'void'

    sous VS2010 (même erreur si std::result_of )

  6. #6
    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
    Citation Envoyé par guillaume07 Voir le message
    ça représente quoi <F()>, je pensais que c'était uen fonction qui renvoyer un F et qui ne prenait aucun arguement, a priori c'est pas le cas vu qu'ici Func est une classe et que ça compile, donc F() represente quoi ?
    Regarde ici pour l'explication

    http://www.boost.org/doc/libs/1_45_0....htm#result_of

    et ici :

    http://anubis.dkuug.dk/jtc1/sc22/wg2...003/n1454.html
    http://www.open-std.org/jtc1/sc22/wg...2005/n1836.pdf

  7. #7
    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
    Merci!
    ça m'étonner que ça puisse marcher sans delctype pour les function object en même temps

  8. #8
    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
    @Joel F: C'est pas sensé retourner le bon type de retour du foncteur d'après les derniers draft de la norme ? (section 20.7.7.6) Parce qu'il me semble bien que c'est sensé être ce que j'ai marqué au dessus, et que dans ce cas le resultat c'est pas void mais bien bool (avec decltype). C'est VS qui est en retard sur ce point ?

  9. #9
    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
    Citation Envoyé par Flob90 Voir le message
    @Joel F: C'est pas sensé retourner le bon type de retour du foncteur d'après les derniers draft de la norme ? (section 20.7.7.6) Parce qu'il me semble bien que c'est sensé être ce que j'ai marqué au dessus, et que dans ce cas le resultat c'est pas void mais bien bool (avec decltype). C'est VS qui est en retard sur ce point ?
    Peut etre, j'ai pas pensé à regarder le standard. JE pense que VS est peut etre encore sur le draft proposal.

    boost::result_of fait de meme anyway

  10. #10
    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
    Je n'ai finalement pas compris cet aspect là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    struct F{ };
    template<class T>
    struct B { };
     
    int main() { 
     
    	B<F(int)> f;   
    }
    ici, dans l'expresion B<F(int)> f; , le compilateur comprends F(int) comme étant quoi ? une signature de fonction ? pourtant il n' y a aucune fonction de déclarer retourner un F et prenant un int...

    EDIT: il est assez malin pour comprendre qu'il s'agit d'un Functor , si oui comment peut il faire la différence avec une signature de contion F myfunc(int param);

  11. #11
    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
    F(int) ets un type.
    c'est le type d'une fonction prenant int en entrée et renvoyant un F.

    Cette notation s'appelle la notation round-lambda, elle sert juste a passer en un seul type un liste arbitraire de type. Elle a l'avantage dans le cadre de result_of de *ressembler* a un appel de fonction.

  12. #12
    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
    pour autant on ne peut pas isoler dans la classe template, F et ses arguements
    tu style
    typedef F return_value;
    typedef A arg_type;

    pour
    B<F(A)> b;

  13. #13
    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
    Citation Envoyé par guillaume07 Voir le message
    pour autant on ne peut pas isoler dans la classe template, F et ses arguements
    tu style
    typedef F return_value;
    typedef A arg_type;

    pour
    B<F(A)> b;
    Je comprends pas ta question tu n'en a pas besoin...

  14. #14
    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
    Admettons la classe suivante


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct Foo
    {
    };
     
    template<typename T>
    struct Bar
    {
    //ici on ne peut pas distinguer Foo et int on a juste Foo(int), non??
    };
    void main()
    {
    Bar<Foo(int)> b;
    }

  15. #15
    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
    Citation Envoyé par guillaume07 Voir le message
    Admettons la classe suivante


    struct Foo
    {
    };

    template<typename T>
    struct Bar
    {
    //ici on ne peut pas distinguer Foo et int on a juste Foo(int), non??
    };
    void main()
    {
    Bar<Foo(int)> b;
    }
    tu veux faire quoi dans Bar aussi ?
    Specialise Bar partiellement pour reconstruire le type F(A) c'est tout.

    Je repete, je ne vois pas l'interet de ta question. Que cherche tu a faire.

  16. #16
    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
    Non je n'ai rien derrière la tête, j'essaye juste de comprendre comment ça marche, pour le moment. quand tu dis "Specialise Bar partiellement pour reconstruire le type F(A) c'est tout."

    tu entends quoi par là finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename T>
    struct Bar<Foo(int)>
    {
     
    };
    ??

  17. #17
    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
    ... non ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<class Function, class Arg>
    struct bar<Function(Arg)>
    {
      typedef Function return_type;
      typedef Arg arg0_type;
    };

  18. #18
    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
    voilà c'est exactement ça que je voulais savoir ty

  19. #19
    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
    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
     
    template<bool Condition,typename Action,typename P> struct F { };
     
    template<typename Action,typename P>
    struct F<true, Action(P)> {
    	typedef Action execute;
    	typedef P param;
    };
     
    struct Action1{
    	bool operator()()const{return true;}
    }; 
     
    int main() {  
    	F<1 , Action1()>::execute();
    }
    Pourquoi F<1 , Action1()>::execute(); ne compile pas ?
    le compilateur visual 2KT m'indique nombre d'argument insuffisant ...

  20. #20
    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
    Citation Envoyé par guillaume07 Voir le message
    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
     
    template<bool Condition,typename Action,typename P> struct F { };
     
    template<typename Action,typename P>
    struct F<true, Action(P)> {
    	typedef Action execute;
    	typedef P param;
    };
     
    struct Action1{
    	bool operator()()const{return true;}
    }; 
     
    int main() {  
    	F<1 , Action1()>::execute();
    }
    Pourquoi F<1 , Action1()>::execute(); ne compile pas ?
    le compilateur visual 2KT m'indique nombre d'argument insuffisant ...
    Action1() ne matche pas Action(P) ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de functor
    Par Kromagg dans le forum C++
    Réponses: 6
    Dernier message: 10/01/2009, 22h17
  2. Problème Functor + Numerical Recipes
    Par Jeromnimo dans le forum C++
    Réponses: 8
    Dernier message: 03/07/2008, 10h17
  3. Réponses: 1
    Dernier message: 15/01/2008, 08h11
  4. Problème avec functor
    Par vandamme dans le forum C++
    Réponses: 7
    Dernier message: 19/04/2007, 01h05
  5. [VB6] Functors ?
    Par Original Prankster dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/01/2007, 16h19

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