#include <functional>
#include <iostream>
class Foo
{
public:
void bar() { std::cout << "Member function: Foo::bar()\n"; }
};
void bar()
{
std::cout << "Free function: bar()\n";
}
class Functor
{
public:
void operator()() { std::cout << "Functor object\n"; }
};
auto lambda = []() { std::cout << "Lambda expression\n"; };
void doSomething(std::function<void ()> fn)
{
fn();
}
int main()
{
doSomething(bar);
doSomething(Functor());
doSomething(lambda);
Foo foo;
doSomething(std::bind(&Foo::bar, &foo));
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIEZvbwp7CnB1YmxpYzoKCXZvaWQgYmFyKCkgeyBzdGQ6OmNvdXQgPDwgIk1lbWJlciBmdW5jdGlvbjogRm9vOjpiYXIoKVxuIjsgfQp9OwoKdm9pZCBiYXIoKQp7CglzdGQ6OmNvdXQgPDwgIkZyZWUgZnVuY3Rpb246IGJhcigpXG4iOwp9CgpjbGFzcyBGdW5jdG9yCnsKcHVibGljOgoJdm9pZCBvcGVyYXRvcigpKCkgeyBzdGQ6OmNvdXQgPDwgIkZ1bmN0b3Igb2JqZWN0XG4iOyB9Cn07CgphdXRvIGxhbWJkYSA9IFtdKCkgeyBzdGQ6OmNvdXQgPDwgIkxhbWJkYSBleHByZXNzaW9uXG4iOyB9OwoKdm9pZCBkb1NvbWV0aGluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IGZuKQp7CglmbigpOwp9CgppbnQgbWFpbigpCnsKCWRvU29tZXRoaW5nKGJhcik7Cglkb1NvbWV0aGluZyhGdW5jdG9yKCkpOwoJZG9Tb21ldGhpbmcobGFtYmRhKTsKCQoJRm9vIGZvbzsKCWRvU29tZXRoaW5nKHN0ZDo6YmluZCgmRm9vOjpiYXIsICZmb28pKTsKCQoJcmV0dXJuIDA7Cn0=