#include <memory>
#include <sstream>
#include <string>
class MyClass {};
bool Post(std::string command, std::string payload) {return false;}
std::string Get(std::string command) { return ""; }
bool Delete(std::string command, std::string name) { return false;}
int OtherFunc(std::string command, bool enabled, const MyClass& name) {return 0;}
enum class CommandType
{
Get, Post, Delete, OtherFunc
};
template<typename ... Ts>
typename std::enable_if<sizeof...(Ts) != 2, int>::type
Post (Ts&&...) {return 0;}
template<typename ... Ts>
typename std::enable_if<sizeof...(Ts) != 2, int>::type
Delete (Ts&&...) {return 0;}
template<typename ... Ts>
typename std::enable_if<sizeof...(Ts) != 3, int>::type
OtherFunc (Ts&&...) {return 0;}
template< typename... Params>
std::unique_ptr<std::stringstream> Execute(CommandType command, Params... parameters) {
auto response = std::make_unique<std::stringstream>();
if(command == CommandType::Get)
*response << Get(parameters...);
else if(command == CommandType::Post)
*response << Post(parameters...);
else if(command == CommandType::Delete)
*response << Delete(parameters...);
else if(command == CommandType::OtherFunc)
*response << OtherFunc(parameters...);
return response;
}
int main(){
Execute(CommandType::Get, "hello");
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CgpjbGFzcyBNeUNsYXNzIHt9OwoKYm9vbCBQb3N0KHN0ZDo6c3RyaW5nIGNvbW1hbmQsIHN0ZDo6c3RyaW5nIHBheWxvYWQpIHtyZXR1cm4gZmFsc2U7fQpzdGQ6OnN0cmluZyBHZXQoc3RkOjpzdHJpbmcgY29tbWFuZCkgeyByZXR1cm4gIiI7IH0KYm9vbCBEZWxldGUoc3RkOjpzdHJpbmcgY29tbWFuZCwgc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gZmFsc2U7fQppbnQgT3RoZXJGdW5jKHN0ZDo6c3RyaW5nIGNvbW1hbmQsIGJvb2wgZW5hYmxlZCwgY29uc3QgTXlDbGFzcyYgbmFtZSkge3JldHVybiAwO30KCmVudW0gY2xhc3MgQ29tbWFuZFR5cGUKewogICAgR2V0LCBQb3N0LCBEZWxldGUsIE90aGVyRnVuYwp9OwoKCnRlbXBsYXRlPHR5cGVuYW1lIC4uLiBUcz4KdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c2l6ZW9mLi4uKFRzKSAhPSAyLCBpbnQ+Ojp0eXBlClBvc3QgKFRzJiYuLi4pIHtyZXR1cm4gMDt9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gVHM+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHNpemVvZi4uLihUcykgIT0gMiwgaW50Pjo6dHlwZQpEZWxldGUgKFRzJiYuLi4pIHtyZXR1cm4gMDt9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gVHM+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHNpemVvZi4uLihUcykgIT0gMywgaW50Pjo6dHlwZQpPdGhlckZ1bmMgKFRzJiYuLi4pIHtyZXR1cm4gMDt9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUuLi4gUGFyYW1zPgpzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmdzdHJlYW0+IEV4ZWN1dGUoQ29tbWFuZFR5cGUgY29tbWFuZCwgUGFyYW1zLi4uIHBhcmFtZXRlcnMpIHsKICAgIGF1dG8gcmVzcG9uc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nc3RyZWFtPigpOwogICAgaWYoY29tbWFuZCA9PSBDb21tYW5kVHlwZTo6R2V0KQogICAgICAgICpyZXNwb25zZSA8PCBHZXQocGFyYW1ldGVycy4uLik7CiAgICBlbHNlIGlmKGNvbW1hbmQgPT0gQ29tbWFuZFR5cGU6OlBvc3QpCiAgICAgICAgKnJlc3BvbnNlIDw8IFBvc3QocGFyYW1ldGVycy4uLik7CiAgICBlbHNlIGlmKGNvbW1hbmQgPT0gQ29tbWFuZFR5cGU6OkRlbGV0ZSkKICAgICAgICAqcmVzcG9uc2UgPDwgRGVsZXRlKHBhcmFtZXRlcnMuLi4pOwogICAgZWxzZSBpZihjb21tYW5kID09IENvbW1hbmRUeXBlOjpPdGhlckZ1bmMpCiAgICAgICAgKnJlc3BvbnNlIDw8IE90aGVyRnVuYyhwYXJhbWV0ZXJzLi4uKTsKCiAgICByZXR1cm4gcmVzcG9uc2U7Cn0KCgppbnQgbWFpbigpewogICAgRXhlY3V0ZShDb21tYW5kVHlwZTo6R2V0LCAiaGVsbG8iKTsKfQo=