Организации функции для передачи другой функции в качестве аргумента
void MyFunc(float x)
{
//......
}
void MyFunc2(int x)
{
//......
}
void MyFunc3(float x, std::string str)
{
//......
}
void Do(/*Функция в качестве параметра*/)
{
// Выполнение этой функции
}
int main(int argc, char** argv) {
Do(MyFunc, 1);
Do(MyFunc, 1.f, "Str");
return 0;
}
Помогите реализовать функцию Do. Мне нужно, чтобы я мог передать туда одну из функций, описанных выше и вызвать ее. Думаю, по коду все понятно :)
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Так вас устроит?
template<typename Func, typename... Arg>
void Do(Func f, Arg... arg)
{
f(arg...);
}
int main(int argc, char** argv) {
Do(MyFunc2, 1);
Do(MyFunc3, 1.f, "Str");
}
Или вы хотите вызывать именно MyFunc, чтоб она принимала несвойственные ей параметры?...
P.S. Более корректно, с учетом всяких возможных ссылок, семантики перемещения etc —
template<typename Func, typename... Arg>
auto Do(Func f, Arg&&... arg) -> decltype(f(std::forward<Arg>(arg)...))
{
return f(std::forward<Arg>(arg)...);
}
Но самый простой метод — просто написать
#define Do std::invoke
поскольку "все укра... придумано до нас", и эта функциональность давно входит в стандартную библиотеку...