#include <iostream>
template<typename T>
class test
{
template <void*>
struct Nothing
{
typedef char type;
};
template <typename U>
static typename Nothing<&U::operator()>::type check(int);
template <typename>
static int check(char);
public:
static const bool is_functor = sizeof(check<T>(0)) == 1;
};
struct a{};
struct b
{
void operator() (){}
};
int main()
{
std::cout << test<a>::is_functor << '\n';
std::cout << test<b>::is_functor << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgdGVzdAp7Cgl0ZW1wbGF0ZSA8dm9pZCo+CiAgICBzdHJ1Y3QgTm90aGluZwogICAgewogICAgICAgIHR5cGVkZWYgY2hhciB0eXBlOwogICAgfTsKIAogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgICBzdGF0aWMgdHlwZW5hbWUgTm90aGluZzwmVTo6b3BlcmF0b3IoKT46OnR5cGUgY2hlY2soaW50KTsKIAogICAgdGVtcGxhdGUgPHR5cGVuYW1lPgogICAgc3RhdGljIGludCBjaGVjayhjaGFyKTsKIApwdWJsaWM6CiAKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2Z1bmN0b3IgPSBzaXplb2YoY2hlY2s8VD4oMCkpID09IDE7Cn07CgpzdHJ1Y3QgYXt9OwpzdHJ1Y3QgYgp7Cgl2b2lkIG9wZXJhdG9yKCkgKCl7fQp9OwoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgdGVzdDxhPjo6aXNfZnVuY3RvciA8PCAnXG4nOwoJc3RkOjpjb3V0IDw8IHRlc3Q8Yj46OmlzX2Z1bmN0b3IgPDwgJ1xuJzsKfQ==