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

Langage C++ Discussion :

methode template prenant une structure


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut methode template prenant une structure
    Bonjour a tous,

    Je poste ici car je n'ai pas trouvé de réponse qui me donne satisfaction sur les différentes pages que j'ai visité.

    Je suis en train de faire un programme en C++ dans lequel j'ai un client/serveur TCP. le serveur/client envoi des messages structurés avec des attributs identique pour tous les messages et d'autres spécifique au message.
    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct messageN
    {
           messageSize
           messsageID
           struct specifiqueAuMessageN
    }
    Je souhaite avoir une méthode template sendMessage(struct messageN, enum connectionType). C'est à dire qui sera capable de traiter une structure de type message1, message2, .. messageN. Le but de cette methode serait de copier la structure dans un tableau, pour en fonction de l'enum l'envoyer dans une methode send() ou write() de linux (voir windows plus tard).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //code de la supposée methode
    sendMessage(struct messageN, enum connectionType)
    { 
        char data[255];
        memcpy(data, &messageN, messageN.messageSize);
     
        if(connectionType == TCP)
        {
           send(fdSocket, data, messageN.messageSize);
        }
    }
    Pour faire cela, suis-je obligé de créer:
    -sendMessage(struct message1, enum connectionType)
    -sendMessage(struct message2, enum connectionType)
    - ...
    -sendMessage(struct messageN, enum connectionType)

    Ou puis je passer par une methode template? Chose que je n'ai jamais utilisé et dont j'aimerai apprendre a me servir.
    Si non quelles sont mes options?

    Je vous remercie par avance.

    Cordialement,
    boubouboy

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Pourquoi ne pas utiliser Boost ???

    http://www.boost.org/doc/libs/1_38_0.../tutorial.html

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    En template la fonction serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename M> void sendMessage( const M& msg , enum connectionType )
    { 
        if ( connectionType == TCP )
        {
           send( fdSocket , &msg , sizeof(msg) );
        }
    }
    Pour la réception, ça ne serait pas aussi simple

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Merci pour vos réponses, cela fonctionne.
    Je n'utilise pas boost simplement parce que j'aime bien comprendre le fonctionnement des choses.

    J'ai une autre question un peu plus complexe.
    Étant donné que j'ai plusieurs type de message différents, je les stockes dans des FIFO qui sont ensuite dépilées par un thread qui les envoies vers la methode template send<>() .

    Pour les ajouter dans les FIFO j'utilise pour l'instant des methodes addMsg(message1), addMsg(message2), .. addMsg(messageN)

    Est-il possible de templatiser ces méthodes, sachant qu'en fonction du type du message je ne le stock pas dans la même fifo??

    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
     
    //actuellement, j'ai quelque chose comme ca:
     
    addMsg(const message1& msg)
    {
       if(connectionType != NONE_COMMUNICATION)
        {    
     
        	if((_Message1QueueQueue.size()<_msgInQueueNbMax) && (_bCancelled == false))
        	{
        		_Message1QueueQueue.push_back(msg);
        	}
        }   
     
    }
     
     
    addMsg(const message2& msg)
    {
       if(connectionType != NONE_COMMUNICATION)
        {    
     
        	if((_Message2QueueQueue.size()<_msgInQueueNbMax) && (_bCancelled == false))
        	{
        		_Message2Queue.push_back(msg);
     
        	}
        }   
     
    }
    en d'autre terme est ce possible de vérifier le type du paramètre en entrée pour l'envoyer dans le bonne FIFO?

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par boubouboy Voir le message
    en d'autre terme est ce possible de vérifier le type du paramètre en entrée pour l'envoyer dans le bonne FIFO?
    Pour faire une sorte de if en fonction du type d'un argument template, le plus simple est d'utiliser la surcharge :
    Tu définis une fonction sendToFifo que tu surcharges pour chaque type supporté par ton template, et qui envoie au bon endroit, et tu l'appelles depuis ton template.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Oui cela fonctionne effectivement, mais c'est actuellement ce que je fais avec les méthodes addMessage qui sont surchargées en fonction du type du message, cela ne fait que déporter le problème dans une méthode "plus profonde de la classe".

    Mais je vais m'en tenir à ce principe pour l'instant.

    Merci

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Tu peux aussi mettre toutes les fifos dans un tuple et récupéré la bonne fifo avec std::get<Fifo<TypeDeMessage>>(tuple). En supposant que la fifo soit template.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Merci pour l'info sur les turples, mais je ne pense pas être assez expérimenté en C++ pour me lancer la-dedans.
    Je garde l'idée dans un coin pour les prochaines évolutions de mon projet.
    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/02/2013, 08h40
  2. [Templates] Remplir une structure
    Par Amnell dans le forum C++
    Réponses: 6
    Dernier message: 05/05/2011, 00h05
  3. Réponses: 6
    Dernier message: 21/07/2009, 13h53
  4. [Template] methode template d'une classe pas template
    Par bigquick dans le forum Langage
    Réponses: 8
    Dernier message: 25/03/2005, 15h09
  5. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11

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