#include <tuple>
//----------------------------------------------------------------------
//
class MessageBase
{
public:
MessageBase( const int _id ) : m_id( _id ) {}
virtual int getMessageID() const { return( m_id ); }
private:
const int m_id;
};
#define MESSAGE( NAME, VAL ) \
class Message##NAME : public MessageBase { \
public: \
Message##NAME() : MessageBase( VAL ) { } \
};
MESSAGE( One, 1 );
MESSAGE( Two, 2 );
MESSAGE( Ten, 10 );
//----------------------------------------------------------------------
//
template <typename... Ts> struct MyMessageHandler;
template <typename T> struct MyMessageHandler<T>
{
virtual void processMsg(const T&) { }
};
template <typename T, typename...Ts>
struct MyMessageHandler<T, Ts...> : MyMessageHandler<T>, MyMessageHandler<Ts...>
{
using MyMessageHandler<T>::processMsg;
using MyMessageHandler<Ts...>::processMsg;
};
template <typename... Ts>
struct MyMessageHandler<std::tuple<Ts...>> : public MyMessageHandler<Ts...>
{
};
//----------------------------------------------------------------------
//
typedef std::tuple< MessageOne, MessageTwo, MessageTen > Foople;
int main()
{
MyMessageHandler< Foople > mmh;
mmh.processMsg( MessageOne() );
}
I2luY2x1ZGUgPHR1cGxlPgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCmNsYXNzIE1lc3NhZ2VCYXNlCnsKICBwdWJsaWM6CiAgICBNZXNzYWdlQmFzZSggY29uc3QgaW50IF9pZCApIDogbV9pZCggX2lkICkge30KICAgIHZpcnR1YWwgaW50IGdldE1lc3NhZ2VJRCgpIGNvbnN0IHsgcmV0dXJuKCBtX2lkICk7IH0KCiAgcHJpdmF0ZToKICAgIGNvbnN0IGludCBtX2lkOwp9OwoKI2RlZmluZSBNRVNTQUdFKCBOQU1FLCBWQUwgKSBcCiAgY2xhc3MgTWVzc2FnZSMjTkFNRSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7IFwKICAgIHB1YmxpYzogXAogICAgICBNZXNzYWdlIyNOQU1FKCkgOiBNZXNzYWdlQmFzZSggVkFMICkgeyB9IFwKICB9OwoKICBNRVNTQUdFKCBPbmUsIDEgKTsKICBNRVNTQUdFKCBUd28sIDIgKTsKICBNRVNTQUdFKCBUZW4sIDEwICk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gc3RydWN0IE15TWVzc2FnZUhhbmRsZXI7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE15TWVzc2FnZUhhbmRsZXI8VD4KewogICAgdmlydHVhbCB2b2lkIHByb2Nlc3NNc2coY29uc3QgVCYpIHsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uVHM+CnN0cnVjdCBNeU1lc3NhZ2VIYW5kbGVyPFQsIFRzLi4uPiA6IE15TWVzc2FnZUhhbmRsZXI8VD4sIE15TWVzc2FnZUhhbmRsZXI8VHMuLi4+CnsKICAgIHVzaW5nIE15TWVzc2FnZUhhbmRsZXI8VD46OnByb2Nlc3NNc2c7CiAgICB1c2luZyBNeU1lc3NhZ2VIYW5kbGVyPFRzLi4uPjo6cHJvY2Vzc01zZzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4Kc3RydWN0IE15TWVzc2FnZUhhbmRsZXI8c3RkOjp0dXBsZTxUcy4uLj4+IDogcHVibGljIE15TWVzc2FnZUhhbmRsZXI8VHMuLi4+CnsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwp0eXBlZGVmIHN0ZDo6dHVwbGU8IE1lc3NhZ2VPbmUsIE1lc3NhZ2VUd28sIE1lc3NhZ2VUZW4gPiBGb29wbGU7CgppbnQgbWFpbigpCnsKICBNeU1lc3NhZ2VIYW5kbGVyPCBGb29wbGUgPiBtbWg7CiAgbW1oLnByb2Nlc3NNc2coIE1lc3NhZ2VPbmUoKSApOwp9Cg==