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 :

Problème avec les Variadics


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut Problème avec les Variadics
    Bonjour,

    Je me permets de venir vous poser une petite question a laquelle je n'ai pas réussi à trouver de réponse...
    J'ai un code que j'essaie de réduire pour plus de clarté mais je suis bloqué avec ma compréhension des variadics

    Actuellement j'ai 3 méthodes qui me permettent d'instancier des objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	EventDto								generateResponseEvent(const std::shared_ptr<Channel> &channel, const std::shared_ptr<Request> &request, const EVENT_CODE &eventCode, const RESULT_CODE &resultCode);
    	EventDto								generateResponseEvent(const std::shared_ptr<Channel> &channel, const std::shared_ptr<Request> &request, const RESULT_CODE &resultCode, const RESULT_CODE &cause);
    	EventDto								generateResponseEvent(const std::shared_ptr<Channel> &channel, const std::shared_ptr<Request> &request, const RESULT_CODE &resultCode, const RESULT_CODE &cause, const ANALYSIS_INFORMATION &information);
    Pour simplifier la chose, je pensais utiliser les variadics et j'ai voulu procéder par étapes...
    Ayant 2 méthodes tres similaires vu qu'elles ont quasiment les memes paramètres (juste un en plus), j'ai fait une première implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EventDto								generateResponseEvent(const std::shared_ptr<Channel> &channel, const std::shared_ptr<Request> &request, const EVENT_CODE &eventCode, const RESULT_CODE &resultCode);
    template<typename ...Args>
    	EventDto										generateResponseEvent(Args ...args) {
    	switch (this->_type)	{
    		case REQUEST_TYPE::ANALYZE :		return EventAnalysisDoneDto(this->_correlationId, args...);
    		...
    		default :							Utils::log(Logger::LEVEL::ALERT, "Cannot generate response event for request of type [%s] !", Utils::getRequestTypeText(this->_type).c_str());
    	}
     
    }
    Ma classe EventAnalysisDoneDto ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	EventAnalysisDoneDto(const std::string &callIdentifier, const std::shared_ptr<Resource> &resource, const std::shared_ptr<Action> &action, const RESULT_CODE &resultCode, const RESULT_CODE &cause, const ANALYSIS_INFORMATION &information = ANALYSIS_INFORMATION::NONE, const std::string &destination = _MCU->getDefaultRoute());
    	EventAnalysisDoneDto(const std::string &callIdentifier, const int &channelId, const std::shared_ptr<Action> &action, const RESULT_CODE &resultCode, const RESULT_CODE &cause, const ANALYSIS_INFORMATION &information = ANALYSIS_INFORMATION::NONE, const std::string &destination = _MCU->getDefaultRoute());
    	EventAnalysisDoneDto(const std::string &callIdentifier, const std::shared_ptr<Resource> &resource, const std::shared_ptr<Request> &request, const RESULT_CODE &resultCode, const RESULT_CODE &cause, const ANALYSIS_INFORMATION &information = ANALYSIS_INFORMATION::NONE, const std::string &destination = _MCU->getDefaultRoute());
    	EventAnalysisDoneDto(const std::string &callIdentifier, const int &channelId, const std::shared_ptr<Request> &request, const RESULT_CODE &resultCode, const RESULT_CODE &cause, const ANALYSIS_INFORMATION &information = ANALYSIS_INFORMATION::NONE, const std::string &destination = _MCU->getDefaultRoute());

    Mon code compile et fonctionne.

    Par contre, si j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EventDto								generateResponseEvent(const std::shared_ptr<Channel> &channel, const std::shared_ptr<Request> &request, const EVENT_CODE &eventCode, const RESULT_CODE &resultCode);
    template<typename ...Args>
    	EventDto										generateResponseEvent(Args&& ...args) {
    	switch (this->_type)	{
    		case REQUEST_TYPE::ANALYZE :		return EventAnalysisDoneDto(this->_correlationId, std::forward<Args>(args)...);
    		...
    		default :							Utils::log(Logger::LEVEL::ALERT, "Cannot generate response event for request of type [%s] !", Utils::getRequestTypeText(this->_type).c_str());
    	}
     
    }
    J'obtiens l'erreur suivante
    In file included from application_events.cpp:14:0:
    ./includes/request.hpp: In instantiation of ‘EventDto Request::generateResponseEvent(Args&& ...) [with Args = {std::shared_ptr<Channel>&, const std::shared_ptr<Request>&, EVENT_CODE, RESULT_CODE&}]’:
    application_events.cpp:85:128: required from here
    ./includes/request.hpp:88:40: error: no matching function for call to ‘EventAnalysisDoneDto::EventAnalysisDoneDto(std::string&, std::shared_ptr<Channel>&, const std::shared_ptr<Request>&, EVENT_CODE, RESULT_CODE&)’

    Donc je comprends l'erreur vu que je n'ai pas de constructeur prenant en paramètre un EVENT_CODE mais je ne comprends pas pourquoi dans la premiere version, ca compile mais pas la deuxieme...
    Si qqun pouvait m'éclairer...


    Deuxième question, y a-t-il possibilité de "dépacker" les paramètres et de récupérer le type d'un argument?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Imo, ton code ne se prête pas aux variadics. Tu as que 3 fonctions, c'est peu, et il te faudra de toute façon créer des fonctions internes pour traiter les types spécifiquement. Si tu es en C++17 tu peux profiter de if constexpr, sinon bof.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Points : 62
    Points
    62
    Par défaut
    Merci pour ton retour. J'ai simplifié mon exemple à 3 mais je n'en aurais pas beaucoup plus
    Je suis bien en C++17 mais je vais complexifier le code au lieu de le simplifier donc je vais laisser tomber
    Merci en tout cas

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

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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