Polymorphisme, templates et variadic
Mesdames, Messieurs,
Je me permets de venir vers vous avec une petite question... Après un petit moment d'arrêt de la programmation en C++, je m'y remets et je ne vous cache pas que j'ai beaucoup perdu... (mais à ce qu'il paraît c'est comme le vélo ^^)
Pour une question pratique, je cherche à avoir une classe me permettant de gérer mes envois d'alertes. Je pensais en grossier à une classe du genre
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class AlerterManager
{
enum TYPE { MAIL, TCHAT, SMS };
private:
std::vector<IAlerter *> _alerters;
public:
AlerterManager() {}
template <typename ...Args>
void addNewAlerter(TYPE alerterType, Args &&...args);
void sendMessage(const std::string &format, Args &&...args) {
vector_iteration {
iterator->sendMessage(format, std::forward<Args>(args)...);
}
}
}; |
Mon but ici est de pouvoir instancier un Alerter de chaque type (donc potentiellement avec un nombre de paramètre variable) et de pouvoir envoyer un message à tous mes alerters.
Afin de rester générique autant que possible et d'essayer de garder un code clair, je voulais utiliser le polymorphisme en commençant par une classe abstraite ressemblant à qqch du genre
Code:
1 2 3 4 5 6
| class iAlerter
{
public:
template <typename ...Args>
virtual void sendMessage(const std::string &format, Args &&...args) = 0;
}; |
et du coup, implémenter mes différents alerters dans le genre
Code:
1 2 3 4 5 6 7 8 9 10 11
| class TchatAlerter : public iAlerter
{
private:
SOCKET_TYPE _sock;
std::string _host, _login, _passwd;
public:
TchatAlerter(const std::string &host, const std::string &login, const std::string &passwd) : _host(host), _login(login), _passwd(passwd) { // INITIATE SOCKET HERE }
~TchatAlerter() {}
virtual void sendMessage(const std::string &format, Args &&...args) { // SEND MESSAGE HERE }
}; |
Le problème est que je ne peux pas utiliser les variadics dans une classe abstraite et ... je ne vois pas du tout comment contourner mon problème.
Ça fait plusieurs jours que je tourne en rond et je me permets donc de faire appel à des experts :)
Si jamais vous aviez ne serait-ce qu'une petite piste...
Merci d'avance
Cordialement,
Julien BAUMGARTEN