Просто напишите функцию для произвольного типа:
template <typename Func>
void foo(Func fun)
{
fun(...);
}
Это будет работать с указателями функций, функторами и лямбдами одинаково.
void f() {}
struct G
{
void operator()() {}
};
foo(&f); // function pointer
foo(G()); // functor
foo([]() { ... }); // lambda