模板代替虚函数

模板代替虚函数

虚函数版本

#include <iostream>
class MessageBase {
public:
virtual void speak() = 0;
~MessageBase() = default;
};

class MoveMsg:MessageBase
{
public:
virtual void speak() override
{
std::cout << "Move" << '\n';
}
};

class SleepMsg :MessageBase
{
public:
virtual void speak() override
{
std::cout << "Sleep" << '\n';
}
};

class ExitMsg :MessageBase
{
public:
virtual void speak() override
{
std::cout << "Exit" << '\n';
}
};

模板版本

#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;
}