Как написать функцию, которая принимает функтор в качестве аргумента - PullRequest
16 голосов
/ 17 октября 2011

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

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

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

Любой

Ответы [ 3 ]

19 голосов
/ 17 октября 2011

Просто напишите функцию для произвольного типа:

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

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

void f() {}

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

foo(&f);           // function pointer
foo(G());          // functor
foo([]() { ... }); // lambda
16 голосов
/ 17 октября 2011

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

Поскольку никто еще не опубликовал решение 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 в компиляторах до C ++ 11.

6 голосов
/ 17 октября 2011

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

template<class F>
void foo( const F& f )
{
    f(x,y);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...