Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <memory>
- using namespace std;
- template <class...Ts>
- struct IPublishOne;
- template <class T>
- struct IPublishOne<T>
- {
- virtual void publish(const T& message) = 0;
- };
- template <class T, class... Ts>
- struct IPublishOne<T, Ts...> : IPublishOne<Ts...>
- {
- virtual void publish(const T& message) = 0;
- };
- struct MessageA
- {
- std::string value;
- };
- struct MessageB
- {
- std::string value;
- };
- struct IPublisher : public IPublishOne<MessageA, MessageB>
- {
- virtual ~IPublisher() = default;
- };
- struct Publisher : public IPublisher
- {
- void publish(const MessageA& message) override
- {
- std::cout << message.value << std::endl;
- }
- void publish(const MessageB& message) override
- {
- std::cout << message.value << std::endl;
- }
- };
- int main()
- {
- const std::unique_ptr<IPublisher> publisher = std::make_unique<Publisher>();
- publisher->publish(MessageA{"hello"});
- // this produces compile error
- publisher->publish(MessageB{"world"});
- return 0;
- }
- template <class T, class... Ts>
- struct IPublishOne<T, Ts...> : IPublishOne<Ts...>
- {
- using IPublishOne<Ts...>::publish; // <<<-------------
- virtual void publish(const T& message) = 0;
- };
Add Comment
Please, Sign In to add comment