Организации функции для передачи другой функции в качестве аргумента

Рейтинг: 2Ответов: 1Опубликовано: 06.03.2023
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. Мне нужно, чтобы я мог передать туда одну из функций, описанных выше и вызвать ее. Думаю, по коду все понятно :)

Ответы

▲ 4Принят

Так вас устроит?

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

поскольку "все укра... придумано до нас", и эта функциональность давно входит в стандартную библиотеку...