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 :

Foncteurs ( petit problème bêbête )


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut Foncteurs ( petit problème bêbête )
    Bonjour, j'aimerais par l'utilisation d'un foncteur pouvoir passer en argument à une autre fonction ce foncteur auquel je passe les arguments du constructeur et qui me retourne directement la valeur de retour de la surcharge de l'opérateur () . Je suis presque sur de l'avoir déjà vu quelques part et j'essaye d'utiliser ceci à mon tour de cette façon ( réduit au plus simple possible )
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <iostream>
     
    using namespace std;
     
     
    class P {
     
    public :
        P(char *data) : c_(data) { }
        ~P() { }
     
        string operator() () const
        {
            string str = c_;
            return str;
        }
     
    private :
        char *c_;
     
    };
     
    class A {
     
    public :
        A() { }
        ~A() { }
     
        void print( string s)
        {
            cout << s << endl;
        }
     
    };
     
    int main()
    {
    	A a;
    	a.print(P("hello world"));
    	return 0;
    }
    Bien sur la compilation échoue sur l'appelle de la méthode print qui n'attend pas un objet de type P pourtant je suis presque sur d'avoir vu une méthode qui permettait ce genre d'écriture.
    Si quelqu'un pouvait éclairer ma lanterne je lui en serais reconnaissant.

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne sais pas trop ce que tu veux faire, mais tu as deux solutions :

    1- Tel que ton code est écrit, il faut appeler l'opérateur ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.print(P("hello world")());
    2- Si tu ne veux pas d'appel explicite, ce n'est pas un opérateur () qu'il te faut mais un opérateur de conversion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    operator string() const
    {
        string str = c_;
        return str;
    }

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut
    Merci beaucoup de ta réponse, en fait je pensais utiliser ce systeme pour des "packets". J'avais tenté auparavant l'operateur de conversion et mon exemple était ptête pas bien choisi en fait je suis en train de confronter plus un problème lié au templates ; mon idée de base et de pouvoir renvoyer différent packets avec l'opérateur de conversion dans des boost::array mais certain des packets peuvent avoir une taille différente.

    le code de mes rêves serait le suivant, mais il ne peut pas fonctionner; je remet en question ce systeme pour le changer peut être encapsulé le boost::array qui me sert de buffer... encore plus qu'une solution, si vous avez des conseils à me donner je suis preneur.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <iostream>
    #include <boost/array.hpp>
     
    using namespace std;
     
     
    class P {
     
    public :
        P(int i) : size_(i) { }
        ~P() { }
     
        template< typename Pod_Type, size_t N >
        operator boost::array<char, 10>() const
        {
            // La taille du buffer dépend des données passées au constructeur
     
            //int taille = 5*2*size_; // calcul débile
            // mais impossible de retourner un boost::array de taille variable car const
            boost::array<char,10> a;
            return a;
        }
     
    private :
        int size_;
     
    };
     
    class A {
     
    public :
        A() { }
        ~A() { }
     
        template< typename Pod_Type, size_t N >
        void print( boost::array<Pod_Type, N>& array)
        {
            cout << array.data() << endl;
        }
     
    };
     
    int main()
    {
    	A a;
    	a.print(P(10));
    	return 0;
    }

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ceci dit, il serait beaucoup plus facile, à mon idée, de fournir directement un const std::string& au constructeur de ta classe...

    En effet, un code du genre de
    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
    21
     
    #include <string>
    #include <iostream>
     
    class a
    {
        public:
            a(const std::string& data):_data(data){}
            ~a(){}
            const std::string& Data(){return _data;}
        private:
            std::string _data;
    };
     
    int main()
    {
        char data[]="hello world";
        a essai(data);
        std::cout<<essai.Data()<<std::endl;
        return 0;
    }
    fonctinone sans problème

    Quitte à utiliser la fonction membre c_str() des std::string si, à un moment donné, tu dois disposer d'une chaine "C style"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut
    En réalité mon problème était plus pour simplifier au maximum l'écriture l'idée était de faire un appelle à une fonction qui permet l'envoie et de lui passer en parramètre le packet particulier par exemple :

    envoie( MonPacket( param1, param2));

    et de pouvoir faire ça avec tous les packet différents chacun proposant un opérateur de convertion vers un boost::array qui me sert de buffer pour stocker le packet.
    Le problème survient je pense parceque la fonction envoie attend en paramettre un boost::array mais ne connais pas les paramètre du template à l'avance donc ça ne peut pas fonctionner. Il faut que je repense ce systeme mais j'aimerai garder une écriture simple.

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi ne pas renvoyer un vrai tableau dynamique (std::vector) ?

    Et puis... Le fait de construire un temporaire avec un paramètre et de définir un opérateur de cast pour renvoyer autre chose, c'est une manière vraiment tordue d'écrire ce qui revient en fait à un bête appel de fonction. Non ?

  7. #7
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut
    Je me suis creusé un peu la tête et je vais adopter une autre solution surement inspiré des shared_const_buffer proposé dans les exemples attaché à la lib asio de boost qui utilise d'ailleur des std::vector.

    Merci de vos réponses.

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

Discussions similaires

  1. Petit problème de classe foncteur template
    Par ailonn dans le forum C++
    Réponses: 6
    Dernier message: 18/06/2011, 23h25
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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