#include <cmath>
#include <functional>
#include <iomanip>
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename F>
auto func(T && t, F && f)
-> typename enable_if<is_same<bool, typename result_of<F(T)>::type>::value, bool>::type
{
return f(t);
}
bool is_pi(double d)
{
// approximately
return d == 3.1415926;
}
int main()
{
cout << boolalpha << func(42, [](int answer){ return answer == 42; }) << endl;
cout << boolalpha << func(M_PI, is_pi);
return 0;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEY+CmF1dG8gZnVuYyhUICYmIHQsIEYgJiYgZikKCS0+IHR5cGVuYW1lIGVuYWJsZV9pZjxpc19zYW1lPGJvb2wsIHR5cGVuYW1lIHJlc3VsdF9vZjxGKFQpPjo6dHlwZT46OnZhbHVlLCBib29sPjo6dHlwZQp7CglyZXR1cm4gZih0KTsKfQoKYm9vbCBpc19waShkb3VibGUgZCkKewoJLy8gYXBwcm94aW1hdGVseQoJcmV0dXJuIGQgPT0gMy4xNDE1OTI2Owp9CgppbnQgbWFpbigpCnsKCWNvdXQgPDwgYm9vbGFscGhhIDw8IGZ1bmMoNDIsIFtdKGludCBhbnN3ZXIpeyByZXR1cm4gYW5zd2VyID09IDQyOyB9KSA8PCBlbmRsOwoJY291dCA8PCBib29sYWxwaGEgPDwgZnVuYyhNX1BJLCBpc19waSk7CglyZXR1cm4gMDsKfQ==