#include <iostream>
enum COMMANDS {
CMD_ZERO,
CMD_ONE,
CMD_TWO,
};
template <COMMANDS cmd> struct command
{
template <typename ... Args>
int operator() (Args&&...) const { return -1; }
};
template <> struct command<CMD_ZERO>
{
int operator()(double a, double b, double c) const
{
std::cout << "cmd0 " << a << ", " << b << ", " << c << std::endl;
return 0;
}
};
template <> struct command<CMD_ONE>
{
int operator()(int a, int b, int c) const
{
std::cout << "cmd1 " << a << ", " << b << ", " << c << std::endl;
return 1;
}
};
template <COMMANDS cmd, typename... Args> int DispatchCommand(Args&&... args)
{
return command<cmd>()(std::forward<Args>(args)...);
}
int main()
{
DispatchCommand<CMD_ZERO>(1, 3.141, 4);
DispatchCommand<CMD_ONE>(5, 6, 7);
DispatchCommand<CMD_TWO>(5, 6, 7, 8, 9);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZW51bSBDT01NQU5EUyB7CiAgICBDTURfWkVSTywKICAgIENNRF9PTkUsCiAgICBDTURfVFdPLAp9OwoKdGVtcGxhdGUgPENPTU1BTkRTIGNtZD4gc3RydWN0IGNvbW1hbmQKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIC4uLiBBcmdzPgogICAgaW50IG9wZXJhdG9yKCkgKEFyZ3MmJi4uLikgY29uc3QgeyByZXR1cm4gLTE7IH0KfTsKCnRlbXBsYXRlIDw+IHN0cnVjdCBjb21tYW5kPENNRF9aRVJPPgp7CiAgICBpbnQgb3BlcmF0b3IoKShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjKSBjb25zdAogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiY21kMCAgIiA8PCBhIDw8ICIsICIgPDwgYiA8PCAiLCAiIDw8IGMgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQp9OwoKdGVtcGxhdGUgPD4gc3RydWN0IGNvbW1hbmQ8Q01EX09ORT4KewogICAgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiLCBpbnQgYykgY29uc3QKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNtZDEgICIgPDwgYSA8PCAiLCAiIDw8IGIgPDwgIiwgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfTsKCnRlbXBsYXRlIDxDT01NQU5EUyBjbWQsIHR5cGVuYW1lLi4uIEFyZ3M+IGludCBEaXNwYXRjaENvbW1hbmQoQXJncyYmLi4uIGFyZ3MpCnsKICAgIHJldHVybiBjb21tYW5kPGNtZD4oKShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CgppbnQgbWFpbigpCnsKICAgIERpc3BhdGNoQ29tbWFuZDxDTURfWkVSTz4oMSwgMy4xNDEsIDQpOwogICAgRGlzcGF0Y2hDb21tYW5kPENNRF9PTkU+KDUsIDYsIDcpOwogICAgRGlzcGF0Y2hDb21tYW5kPENNRF9UV08+KDUsIDYsIDcsIDgsIDkpOwogICAgcmV0dXJuIDA7Cn0K