#include <iostream> #include <type_traits> #include <string>
class MoveMsg { public: MoveMsg(int, int) {} void speak() { std::cout << "Move" << '\n'; }
};
class SleepMsg { public: SleepMsg(std::string) {} void speak() { std::cout << "Sleep" << '\n'; }
};
class ExitMsg { public: void speak() { std::cout << "Exit" << '\n'; }
};
template <typename Msg> class MsgImpl { Msg msg; public: template<typename... Args> MsgImpl(Args&&...args) : msg(std::forward<Args>(args)...) {} void speak() { msg.speak(); } };
int main() { MsgImpl<MoveMsg> mmsg(1, 2); MsgImpl<SleepMsg> smsg("Hello"); MsgImpl<ExitMsg> emsg(); return 0; }
|