Подтвердить что ты не робот

Как написать функцию, которая принимает функтор в качестве аргумента

В основном я хочу это сделать: Могу ли я использовать функцию лямбда или объект std:: function вместо указателя на функцию?

ясно, что теперь невозможно для функций, которые ожидают указателя функции. Однако он будет работать для функции, которая ожидает функтора (я сделал это раньше с помощью функции stl sort())

Однако я не знаю, как написать функцию, которая принимает функтор в качестве аргумента!

Кто-нибудь?

4b9b3361

Ответ 1

Просто напишите функцию, чтобы взять произвольный тип:

template <typename Func>
void foo(Func fun)
{
    fun(...);
}

Затем это будет работать с указателями функций, функторами и лямбдами.

void f() {}

struct G
{
    void operator()() {}
};

foo(&f);           // function pointer
foo(G());          // functor
foo([]() { ... }); // lambda

Ответ 2

Я не знаю, как написать функцию, которая принимает функтор в качестве аргумента!

Так как никто еще не разместил решение std::function:

#include <functional>
#include <iostream>

void foo(std::function<int(int)> f)
{
    for (int i = 0; i < 10; ++i)
    {
        std::cout << f(i) << ' ';
    }
    std::cout << '\n';
}

int main()
{
    foo( [](int x) { return x*x; } );
}

Вы можете использовать boost::function в компиляторах pre С++ 11.

Ответ 3

Он должен быть шаблоном, например:

template<class F>
void foo( const F& f )
{
    f(x,y);
}