#include <iostream>
template <bool, typename=void> struct enable_if {};
template <typename T> struct enable_if<true, T> { typedef T type; };
template <typename T> T declval();
template<typename T>
class test
{
typedef char yes[1];
typedef char no[2];
template <typename U>
static yes& check2(U T::*);
template <typename U>
static typename enable_if<sizeof(check2(&U::operator()))==sizeof(yes), yes>::type& check(U);
static no& check(...);
public:
static const bool is_functor = sizeof(check(declval<T>())) == 1;
};
struct a{};
struct b
{
const volatile void operator() (a,a,a) const volatile {}
};
int main()
{
std::cout << test<a>::is_functor << '\n';
std::cout << test<b>::is_functor << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGJvb2wsIHR5cGVuYW1lPXZvaWQ+IHN0cnVjdCBlbmFibGVfaWYge307CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgZW5hYmxlX2lmPHRydWUsIFQ+IHsgdHlwZWRlZiBUIHR5cGU7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBkZWNsdmFsKCk7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyB0ZXN0CnsKCXR5cGVkZWYgY2hhciB5ZXNbMV07CiAgICB0eXBlZGVmIGNoYXIgbm9bMl07CiAgICAKCXRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICAgc3RhdGljIHllcyYgY2hlY2syKFUgVDo6Kik7CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICAgc3RhdGljIHR5cGVuYW1lIGVuYWJsZV9pZjxzaXplb2YoY2hlY2syKCZVOjpvcGVyYXRvcigpKSk9PXNpemVvZih5ZXMpLCB5ZXM+Ojp0eXBlJiBjaGVjayhVKTsKIAogICAgc3RhdGljIG5vJiBjaGVjayguLi4pOwogCnB1YmxpYzoKIAogICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZnVuY3RvciA9IHNpemVvZihjaGVjayhkZWNsdmFsPFQ+KCkpKSA9PSAxOwp9OwoKc3RydWN0IGF7fTsKc3RydWN0IGIKewoJY29uc3Qgdm9sYXRpbGUgdm9pZCBvcGVyYXRvcigpIChhLGEsYSkgY29uc3Qgdm9sYXRpbGUge30KfTsKCmludCBtYWluKCkKewoJc3RkOjpjb3V0IDw8IHRlc3Q8YT46OmlzX2Z1bmN0b3IgPDwgJ1xuJzsKCXN0ZDo6Y291dCA8PCB0ZXN0PGI+Ojppc19mdW5jdG9yIDw8ICdcbic7Cn0=