#include <iostream>
#include <functional>
class Foo
{
public:
explicit Foo(int n) : n_{n} {}
int getN() const
{
return n_;
}
private:
int n_;
};
class Bar
{
public:
void bar(const std::function<int(std::function<int()>)>& callback,
const std::function<int()>& callback2) const
{
std::cout << "The value of n+1 is: " << callback(callback2) << '\n';
}
};
class FooBar
{
public:
int increment(const std::function<int()>& callback) const
{
auto n = callback();
return ++n;
}
};
int main()
{
Bar b;
b.bar(std::bind(&FooBar::increment, FooBar{},
std::bind(&Foo::getN, Foo{2018})),
std::bind(&Foo::getN, Foo{2018}));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIEZvbwp7CnB1YmxpYzoKICAgIGV4cGxpY2l0IEZvbyhpbnQgbikgOiBuX3tufSB7fQogICAgCiAgICBpbnQgZ2V0TigpIGNvbnN0CiAgICB7CiAgICAJcmV0dXJuIG5fOwogICAgfQoKcHJpdmF0ZToKICAgIGludCBuXzsKfTsKCmNsYXNzIEJhcgp7CnB1YmxpYzoKICAgIHZvaWQgYmFyKGNvbnN0IHN0ZDo6ZnVuY3Rpb248aW50KHN0ZDo6ZnVuY3Rpb248aW50KCk+KT4mIGNhbGxiYWNrLAogICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGludCgpPiYgY2FsbGJhY2syKSBjb25zdAogICAgewogICAgCXN0ZDo6Y291dCA8PCAiVGhlIHZhbHVlIG9mIG4rMSBpczogIiA8PCBjYWxsYmFjayhjYWxsYmFjazIpIDw8ICdcbic7CiAgICB9Cn07CgpjbGFzcyBGb29CYXIKewpwdWJsaWM6CiAgICBpbnQgaW5jcmVtZW50KGNvbnN0IHN0ZDo6ZnVuY3Rpb248aW50KCk+JiBjYWxsYmFjaykgY29uc3QKICAgIHsKICAgIAlhdXRvIG4gPSBjYWxsYmFjaygpOwogICAgCXJldHVybiArK247CiAgICB9Cn07CgppbnQgbWFpbigpCnsKCUJhciBiOwoJYi5iYXIoc3RkOjpiaW5kKCZGb29CYXI6OmluY3JlbWVudCwgRm9vQmFye30sCglzdGQ6OmJpbmQoJkZvbzo6Z2V0TiwgRm9vezIwMTh9KSksCglzdGQ6OmJpbmQoJkZvbzo6Z2V0TiwgRm9vezIwMTh9KSk7CgoJcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:43:34: error: no matching function for call to ‘Bar::bar(std::_Bind_helper<false, int (FooBar::*)(const std::function<int()>&) const, FooBar, std::_Bind<std::_Mem_fn<int (Foo::*)() const>(Foo)> >::type, std::_Bind_helper<false, int (Foo::*)() const, Foo>::type)’
std::bind(&Foo::getN, Foo{2018}));
^
prog.cpp:21:10: note: candidate: void Bar::bar(const std::function<int(std::function<int()>)>&, const std::function<int()>&) const
void bar(const std::function<int(std::function<int()>)>& callback,
^~~
prog.cpp:21:10: note: no known conversion for argument 1 from ‘std::_Bind_helper<false, int (FooBar::*)(const std::function<int()>&) const, FooBar, std::_Bind<std::_Mem_fn<int (Foo::*)() const>(Foo)> >::type {aka std::_Bind<std::_Mem_fn<int (FooBar::*)(const std::function<int()>&) const>(FooBar, std::_Bind<std::_Mem_fn<int (Foo::*)() const>(Foo)>)>}’ to ‘const std::function<int(std::function<int()>)>&’