Guest User

Untitled

a guest
Jun 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. using namespace std;
  5.  
  6. template <class...Ts>
  7. struct IPublishOne;
  8.  
  9. template <class T>
  10. struct IPublishOne<T>
  11. {
  12. virtual void publish(const T& message) = 0;
  13. };
  14.  
  15. template <class T, class... Ts>
  16. struct IPublishOne<T, Ts...> : IPublishOne<Ts...>
  17. {
  18. virtual void publish(const T& message) = 0;
  19. };
  20.  
  21. struct MessageA
  22. {
  23. std::string value;
  24. };
  25.  
  26. struct MessageB
  27. {
  28. std::string value;
  29. };
  30.  
  31. struct IPublisher : public IPublishOne<MessageA, MessageB>
  32. {
  33. virtual ~IPublisher() = default;
  34. };
  35.  
  36. struct Publisher : public IPublisher
  37. {
  38.  
  39. void publish(const MessageA& message) override
  40. {
  41. std::cout << message.value << std::endl;
  42. }
  43.  
  44. void publish(const MessageB& message) override
  45. {
  46. std::cout << message.value << std::endl;
  47. }
  48. };
  49.  
  50. int main()
  51. {
  52. const std::unique_ptr<IPublisher> publisher = std::make_unique<Publisher>();
  53.  
  54. publisher->publish(MessageA{"hello"});
  55.  
  56. // this produces compile error
  57. publisher->publish(MessageB{"world"});
  58.  
  59. return 0;
  60. }
  61.  
  62. template <class T, class... Ts>
  63. struct IPublishOne<T, Ts...> : IPublishOne<Ts...>
  64. {
  65. using IPublishOne<Ts...>::publish; // <<<-------------
  66.  
  67. virtual void publish(const T& message) = 0;
  68. };
Add Comment
Please, Sign In to add comment