Поскольку вы пометили свой вопрос как C ++ 17, вы можете использовать шаблон функции переменной с кратным выражением :
template<typename ...Funcs>
std::vector<double> solver(const std::map<std::string, double>& inputs, Funcs&&... funcs)
{
std::vector<double> results;
(results.push_back(funcs(inputs)), ...);
return results;
}
Я изменил тип аргумента на const std::map<std::string, double>&
по причинам производительности.Передача по ссылке (&
) рекомендуется здесь.Передача по значению будет копировать std::map
при каждом вызове функции.Так что функции должны быть объявлены как:
double func1(const std::map<std::string, double>& arr);
Теперь вам больше не нужен вектор для передачи функций.Вы можете просто передать их непосредственно в качестве аргументов solver
:
int main()
{
std::map<std::string, double> inputs {
{"one", 1.0},
{"two", 2.0},
{"three", 3.0},
{"four", 4.0}
};
auto results = solver(inputs, func1, func2);
}
Обратите внимание, что шаблон функции solver
принимает все вызываемые.Например, лямбды также работают:
solver(inputs,
[](auto arr){ return arr["one"] * 3.0 - arr["two"]; },
[](auto arr){ return 1 / arr["three"] + 3.0 * arr["two"]; }
);
(Вы можете использовать const std::map<std::string, double>& arr
вместо auto arr
, если это более читабельно для вас. Обратите внимание, что auto
в лямбде означает, что лямбда становится шаблоном.)