#include <iostream>
template<typename R, typename... Args>
auto foo( R (*bar)(Args...), Args... args)
{
return bar(std::forward<Args>(args)...);
}
int main()
{
/*
* mismatched types ‘void (*)(Args ...)’ and ‘main()::<lambda(int, float)>’
*
foo([](int x, float y)
{
std::cout << x << " " << y << std::endl;
},
5, 42.42f
);
*/
foo(+[](int x, float y)
{
std::cout << x << " " << y << std::endl;
},
5, 42.42f
);
foo(+[](int x)
{
std::cout << x << std::endl;
return x;
},
100500
);
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBhdXRvIGZvbyggUiAoKmJhcikoQXJncy4uLiksIEFyZ3MuLi4gYXJncykKICAgIHsKICAgIAlyZXR1cm4gYmFyKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICB9CiAgICAgCiAgICBpbnQgbWFpbigpCiAgICB7CiAgICAJLyoKICAgIAkgKiBtaXNtYXRjaGVkIHR5cGVzIOKAmHZvaWQgKCopKEFyZ3MgLi4uKeKAmSBhbmQg4oCYbWFpbigpOjo8bGFtYmRhKGludCwgZmxvYXQpPuKAmQogICAgCSAqCiAgICAJZm9vKFtdKGludCB4LCBmbG9hdCB5KQogICAgCSAgICAgewogICAgCQkgICBzdGQ6OmNvdXQgPDwgeCA8PCAiICIgPDwgeSA8PCBzdGQ6OmVuZGw7CiAgICAJCSB9LAogICAgCQk1LCA0Mi40MmYKICAgIAkgICApOwogICAgCSovCiAgICAgCiAgICAJZm9vKCtbXShpbnQgeCwgZmxvYXQgeSkKICAgIAkgICAgIHsKICAgIAkJICAgc3RkOjpjb3V0IDw8IHggPDwgIiAiIDw8IHkgPDwgc3RkOjplbmRsOwogICAgCQkgfSwKICAgIAkJNSwgNDIuNDJmCiAgICAJICAgKTsKICAgICAKICAgICAgICBmb28oK1tdKGludCB4KQogICAgCSAgICAgewogICAgCQkgICBzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7CiAgICAJCSAgIHJldHVybiB4OwogICAgCQkgfSwKICAgIAkJMTAwNTAwCiAgICAJICAgKTsKICAgIAkgICAKICAgIAlyZXR1cm4gMDsKICAgIH0=