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 :
Pour simplifier la chose, je pensais utiliser les variadics et j'ai voulu procéder par étapes...
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);
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:
Ma classe EventAnalysisDoneDto ressemble à :
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()); } }
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:
J'obtiens l'erreur suivante
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()); } }
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?
Partager