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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 confirm�
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    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 Invit� 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