У меня есть функция, которую я пытаюсь преобразовать, чтобы использовать вариативные шаблоны. К сожалению, расширение шаблона вызывает проблемы при попытке строго ввести функции во время компиляции.Шаблон Variadic, имитирующий расширение «runtime»
Вот старый код:
std::unique_ptr<std::stringstream> Execute(CommandType command, ...) {
auto resp = std::make_unique<std::stringstream>();
va_list vl;
va_start(vl, command);
switch(command) {
case CommandType::Post:
*resp << Post(va_arg(vl, char *), va_arg(vl, char *));
break;
case CommandType::Get:
*resp << Get(va_arg(vl, char *));
break;
case CommandType::Delete:
*resp << Delete(va_arg(vl, char *), va_arg(vl, char *));
break;
}
va_end(vl);
return resp;
}
и соответствующие функции:
bool Post(char *command, char *payload);
char *Get(char *command);
bool Delete(char *command, char *name);
В идеале, я хотел бы быть в состоянии преобразовать это что-то вдоль линий этого:
template< typename... Params>
std::unique_ptr<stringstream> Execute(CommandType command, Params... parameters) {
auto response = std::make_unique<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;
};
bool Post(std::string command, std::string payload);
std:string Get(std::string command);
bool Delete(std::string command, std::string name);
int OtherFunc(std::string command, bool enabled, MyClass name);
- OtherFunc добавлен здесь для получения дополнительной информации Пример типа lex.
Но, очевидно, это не работает, потому что компилятор считает, что каждая команда должна получить параметры, переданные в шаблон, когда только один на основе CommandType должен фактически получать параметры.
Любые трюки, чтобы переписать это с помощью шаблонов и поддерживать сильные типы, или мне нужно оставить это, используя переменные arg и указатели?
Как в стороне, старый код имеет неопределенное поведение. Ваши вызовы 'va_arg' не гарантируются в любом конкретном порядке - аргументы функции могут быть оценены в любом порядке. Я видел, как компиляторы переупорядочивают их по разным причинам, например. после изменения настроек оптимизации. – StilesCrisis