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 :

foncteur, type fonction, composition


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut foncteur, type fonction, composition
    Bonjour à tous, j'essaie de me mettre à boost::constrained_object (http://student.agh.edu.pl/~kawulak/c...lue/index.html). Je voudrais donc créer un type basé sur boost::posix_time::time_period qui obligerait la création de période valide (c'est-à-dire non nulle). Pour cela j'ai crée un premier foncteur déterminant la validité d'une période:
    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
     
    #include <boost/date_time.hpp>
    	//pour la période
     
    using boost::posix_time::time_period;
     
    /** @class is_null
    * @brief classe foncteur déterminant la validité d'une période
    */
    struct is_null
    {
    	typedef time_period argument_type;
     
    	bool operator()(time_period p) const
    	{ return p.is_null(); }
    };
    maintenant, je voudrais juste créer un foncteur comme la négation du premier, pour ça j'ai crée un autre foncteur:
    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
     
    /** @class not
    * @brief classe foncteur template définissant la négation du foncteur template
    */
    template<typename Foncteur>
    struct not
    {
    	typedef typename Foncteur::argument_type argument_type;
     
    	bool operator()(typename Foncteur::argument_type elt) const
    	{ return !f(elt); }
     
    private:
    	Foncteur f;
    };
    ce qui me permet alors d'écrire mon type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <boost/constrained_value.hpp>
    	//pour contraindre la période à être valide
     
    /** Le type représentant une période valide. Si la date de fin de période est <= à la date de début de période une exception est levée */
    	typedef boost::constrained_value::constrained<time_period, not<is_null>> not_null_period;
    bon ok ça marche mais je me suis dit "pourquoi ne pas utiliser les foncteurs définis par la STL?" et bien là, je vois pas trop comment utiliser le unary_negate de la STL puisqu'il impose à sa construction de prendre une instance du foncteur à nier.
    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
     
    template<class _Fn1>
    	class unary_negate
    	: public unary_function<typename _Fn1::argument_type, bool>
    	{	// functor adapter !_Func(left)
    public:
    	explicit unary_negate(const _Fn1& _Func)
    		: _Functor(_Func)
    		{	// construct from functor
    		}
     
    	bool operator()(const typename _Fn1::argument_type& _Left) const
    		{	// apply functor to operand
    		return (!_Functor(_Left));
    		}
     
    protected:
    	_Fn1 _Functor;	// the functor to apply
    	};
    (c'est la version de visual 2008)
    En gros de ce que j'en comprend, ça crée un type à partir d'une instance du foncteur alors que dans ma démarche ce serait plus de la création de type à partir d'un type fonction.
    Est-ce que j'ai loupé un truc? Y-a t-il des éléments dans boost qui vont dans le sens de ce que j'ai écris (mais alors en mieux)... voilà, j'ai un peu de mal à m'y retrouver dans tout ça

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    salut

    l'exemple de référence t'aide t'il ?
    Néanmoins, il semble en effet qu'il utilise bien une instance de ta classe.... ce qui veut dire qu'il compte donc appeler la fonction et non la recopier de manière template...

    Je suppose que c'est un choix qui doit se justifier, mais je ne connais pas la raison...

    bonne chance
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Effectivement, dans l'exemple il utilise bien une instance, le truc c'est qu'avec la lib boost::constrained_object, on a besoin d'un constructeur par défaut du type contrainte (et donc avec le unary_negate, on n'en dispose plus du fait qu'il n'a qu'un constructeur avec le type foncteur comme argument). Donc au final, je peux pas écrire un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /** Le type représentant une période valide. Si la date de fin de période est <= à la date de début de période une exception est levée */
    	typedef boost::constrained_value::constrained<time_period, std::unary_negate<is_null>> not_null_period;
    C'est dommage de ne pas pouvoir définir un type composé sans passer par l'instantiation d'un composant avec ceux de la stl. Je pense qu'il doit bien y avoir une raison de ce choix mais bon là je vois pas trop.

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    ta solution template n'est pas forcément mauvaise, pourquoi prendre le unary_negate de la stl, si celui-ci ne te convient pas ?
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    typedef boost::constrained_value::constrained<time_period, std::unary_negate<is_null>> not_null_period;
    devrait très bien marcher, à condition que tu construises tes not_null_period en donnant is_null() comme argument.
    Boost ftw

  6. #6
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par loufoque Voir le message
    devrait très bien marcher, à condition que tu construises tes not_null_period en donnant is_null() comme argument.
    Tu es sûr ? car dans ce cas, l'objet créé risque d'être immédiatement détruit... et les appels ultérieurs à la fonction risquent de se faire par des pointeurs invalides non ?
    et si ce n'est pas la cas, je ne vois alors pas l'interet de passer par une instance ou de ne pas avoir prévu de constructeur par défaut.....


    si tu pouvais éclairer ma lanterne....
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Je n'ai pas encore testé la solution proposée par loufoque mais dans tout les cas, unary_negate copie le foncteur paramètre et le stocke en variable membre, donc à priori pas de souci au niveau de la destruction de l'objet passé lors de la construction.
    Je suis d'accord avec toi sur la seconde partie de ton intervention, je ne comprend pas trop non plus pourquoi ne pas avoir prévu de constructeur par défaut.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu es sûr ? car dans ce cas, l'objet créé risque d'être immédiatement détruit... et les appels ultérieurs à la fonction risquent de se faire par des pointeurs invalides non ?
    Regarde le code de unary_negate qui a été donné. Le foncteur est copié dans _Functor.
    Boost ftw

  9. #9
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Regarde le code de unary_negate qui a été donné. Le foncteur est copié dans _Functor.
    je suis distrait
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

Discussions similaires

  1. [V8] Mise a jour d'un field de type fonction qui utilise un autre field fonction
    Par chagala dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 29/05/2015, 20h09
  2. Curryfication Type Fonction
    Par Diakt dans le forum Caml
    Réponses: 9
    Dernier message: 08/03/2012, 22h22
  3. fichier externe type fonctions.js
    Par Dendrite dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 19/11/2008, 15h36
  4. Problème de foncteur de fonction membre
    Par mister3957 dans le forum C++
    Réponses: 1
    Dernier message: 30/07/2008, 16h12
  5. Fonction de type tableau
    Par Charles f dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2002, 15h04

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