Как написать функцию, которая принимает функтор в качестве аргумента
В основном я хочу это сделать:
Могу ли я использовать функцию лямбда или объект std:: function вместо указателя на функцию?
ясно, что теперь невозможно для функций, которые ожидают указателя функции. Однако он будет работать для функции, которая ожидает функтора (я сделал это раньше с помощью функции stl sort())
Однако я не знаю, как написать функцию, которая принимает функтор в качестве аргумента!
Кто-нибудь?
Ответы
Ответ 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);
}