Permettez-moi de vous donner un exemple de code.
#include <iostream>
#include <utility>
#include <tuple>
template <typename Service>
struct SubscriberImpl {
virtual void handleService(Service const&) = 0;
};
template <typename...ServiceType>
struct Subscriber : SubscriberImpl<ServiceType>... {
};
struct IntService {};
struct FloatService {};
template <typename StatusUpdatePolicy, typename... ServiceType>
struct StatusUpdater : Subscriber<ServiceType...>
{
StatusUpdater(StatusUpdatePolicy const& statusUpdater)
: m_statusUpdater{statusUpdater}
{}
// wont work
void handleService(IntService const& service) override {
m_statusUpdater.updateService(service);
}
void handleService(FloatService const& service) override {
m_statusUpdater.updateService(service);
}
StatusUpdatePolicy m_statusUpdater;
};
struct DummyPolicy {
void updateService(IntService const& service) {
m_i = 42;
std::cout << m_i << "\n";
}
void updateService(FloatService const& service) {
m_f = 3.14f;
std::cout << m_f << "\n";
}
int m_i;
float m_f;
};
int main() {
StatusUpdater<DummyPolicy, IntService, FloatService> su(DummyPolicy{});
su.handleService(IntService{});
su.handleService(FloatService{});
}
Ici Subscriber
possède une fonction virtuelle pure handleService(ServiceType const)
pour chaque paramètre de modèle dans le paquet ServiceType...
. Je dois donc remplacer chacun d'entre eux sur StatusUpdater
. Ici, j'ai fourni ceux dont j'ai besoin à la main pour IntService
y FloatService
sachant que je n'aurai besoin que de ces deux éléments dans cet exemple minimal. Mais je veux être capable de fournir une surcharge pour tout ce qu'il y a dans le pack ServiceType...
. Tous appelleront updateService
de la politique donnée.
Veuillez noter que Subscriber
provient d'une bibliothèque externe et je ne peux pas modifier sa définition.