struct A {
bool toBool() const { return true; }
template<typename T> T to() const { return T();}
};
template<typename From, typename To>
class has_to_func
{
typedef char (&Two)[2];
template<typename F, To (F::*)() const> struct helper {};
template<typename F> static char test(helper<F, &F::template to<To> >*);
template<typename F> static Two test(...);
public:
static const bool value = (sizeof(test<From>(0)) == sizeof(char));
};
#include <iostream>
int main()
{
::std::cout << "int: " << has_to_func<int, bool>::value
<< ", A: " << has_to_func<A, bool>::value << ::std::endl;
}
c3RydWN0IEEgewogICAgYm9vbCB0b0Jvb2woKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHRvKCkgY29uc3QgeyByZXR1cm4gVCgpO30KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgpjbGFzcyBoYXNfdG9fZnVuYwp7CiAgICB0eXBlZGVmIGNoYXIgKCZUd28pWzJdOwogICAgdGVtcGxhdGU8dHlwZW5hbWUgRiwgVG8gKEY6OiopKCkgY29uc3Q+IHN0cnVjdCBoZWxwZXIge307CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdGF0aWMgY2hhciB0ZXN0KGhlbHBlcjxGLCAmRjo6dGVtcGxhdGUgdG88VG8+ID4qKTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIEY+IHN0YXRpYyBUd28gdGVzdCguLi4pOwpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IChzaXplb2YodGVzdDxGcm9tPigwKSkgPT0gc2l6ZW9mKGNoYXIpKTsKfTsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkKewogICAgOjpzdGQ6OmNvdXQgPDwgImludDogIiA8PCBoYXNfdG9fZnVuYzxpbnQsIGJvb2w+Ojp2YWx1ZQogICAgICAgIDw8ICIsIEE6ICIgPDwgaGFzX3RvX2Z1bmM8QSwgYm9vbD46OnZhbHVlIDw8IDo6c3RkOjplbmRsOwp9Cg==