fork download
  1. #include <tuple>
  2.  
  3. //----------------------------------------------------------------------
  4. //
  5. class MessageBase
  6. {
  7. public:
  8. MessageBase( const int _id ) : m_id( _id ) {}
  9. virtual int getMessageID() const { return( m_id ); }
  10.  
  11. private:
  12. const int m_id;
  13. };
  14.  
  15. #define MESSAGE( NAME, VAL ) \
  16.   class Message##NAME : public MessageBase { \
  17.   public: \
  18.   Message##NAME() : MessageBase( VAL ) { } \
  19.   };
  20.  
  21. MESSAGE( One, 1 );
  22. MESSAGE( Two, 2 );
  23. MESSAGE( Ten, 10 );
  24.  
  25. //----------------------------------------------------------------------
  26. //
  27.  
  28. template <typename... Ts> struct MyMessageHandler;
  29.  
  30. template <typename T> struct MyMessageHandler<T>
  31. {
  32. virtual void processMsg(const T&) { }
  33. };
  34.  
  35. template <typename T, typename...Ts>
  36. struct MyMessageHandler<T, Ts...> : MyMessageHandler<T>, MyMessageHandler<Ts...>
  37. {
  38. using MyMessageHandler<T>::processMsg;
  39. using MyMessageHandler<Ts...>::processMsg;
  40. };
  41.  
  42. template <typename... Ts>
  43. struct MyMessageHandler<std::tuple<Ts...>> : public MyMessageHandler<Ts...>
  44. {
  45. };
  46.  
  47. //----------------------------------------------------------------------
  48. //
  49. typedef std::tuple< MessageOne, MessageTwo, MessageTen > Foople;
  50.  
  51. int main()
  52. {
  53. MyMessageHandler< Foople > mmh;
  54. mmh.processMsg( MessageOne() );
  55. }
  56.  
Success #stdin #stdout 0s 3292KB
stdin
Standard input is empty
stdout
Standard output is empty