template <class Receiver>
class Command
{
virtual void Execute() = 0;
};
class Launcher
{};
class LauncherCommand : public Command<Launcher>
{
virtual void Execute() override {}
};
class LauncherCommandChangeSimulation : public LauncherCommand
{};
class Menu
{
public:
template <class T>
void AddLeaf(Command<T> &command, const int parentId)
{}
};
int main()
{
LauncherCommandChangeSimulation command;
Menu menu;
menu.AddLeaf(command, 42);
}
dGVtcGxhdGUgPGNsYXNzIFJlY2VpdmVyPgpjbGFzcyBDb21tYW5kCnsKICAgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCkgPSAwOwp9OwoKY2xhc3MgTGF1bmNoZXIKe307CgpjbGFzcyBMYXVuY2hlckNvbW1hbmQgOiBwdWJsaWMgQ29tbWFuZDxMYXVuY2hlcj4KewoJdmlydHVhbCB2b2lkIEV4ZWN1dGUoKSBvdmVycmlkZSB7fQp9OwoKY2xhc3MgTGF1bmNoZXJDb21tYW5kQ2hhbmdlU2ltdWxhdGlvbiA6IHB1YmxpYyBMYXVuY2hlckNvbW1hbmQKe307CgpjbGFzcyBNZW51CnsKcHVibGljOgogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICB2b2lkIEFkZExlYWYoQ29tbWFuZDxUPiAmY29tbWFuZCwgY29uc3QgaW50IHBhcmVudElkKQogICAge30KfTsKCmludCBtYWluKCkKewoJTGF1bmNoZXJDb21tYW5kQ2hhbmdlU2ltdWxhdGlvbiBjb21tYW5kOwoJTWVudSBtZW51OwoKCW1lbnUuQWRkTGVhZihjb21tYW5kLCA0Mik7Cn0=