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:
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:
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:
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:
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?