Вызов функции с вектором аргументов - PullRequest
1 голос
/ 27 марта 2019

У меня есть std::vector аргументов, и я хотел бы вызвать функцию с ними. Есть ли способ сделать это?

В частности, это функция mysqlx select , а аргументы - это столбцы, которые я пытаюсь запросить; все они будут иметь тип std::string. Цель функции - уменьшить дублирование в кодовой базе.

(Это похоже на полезную тему, но я не смог найти ответ через поиск. Если я пропустил его, и на него уже был дан ответ, пожалуйста, укажите мне на вопрос и закройте его как дубликат, спасибо.)

1 Ответ

3 голосов
/ 27 марта 2019

Вы можете сделать это, вплоть до максимального количества аргументов во время компиляции. Это не красиво.

using result_type = // whatever
using arg_type = // whatever
using args_type = const std::vector<arg_type> &;
using function_type = std::function<result_type(args_type)>;

template <size_t... Is>
result_type apply_vector_static(args_type args, std::index_sequence<Is...>)
{
    return select(args[Is]...);
}

template<size_t N>
result_type call_apply_vector(args_type args)
{ 
    return apply_vector_static(args, std::make_index_sequence<N>()); 
}

template <size_t... Is>
std::map<size_t, function_type> make_funcs(std::index_sequence<Is...>)
{
    return { { Is, call_apply_vector<Is> }... };
}

result_type apply_vector(args_type args)
{
    // Some maximum limit
    static const auto limit = std::make_index_sequence<50>();
    static const auto funcs = make_funcs(limit);
    return funcs.at(args.size())(args);
}

Посмотреть вживую

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...