#include <iostream>
#include <boost/utility/enable_if.hpp>
#include <boost/static_assert.hpp>
// Has_hello<T>::value is true if T has a hello function.
template<typename T>
struct has_hello {
typedef char yes[1];
typedef char no [2];
template <typename U> struct type_check;
template <typename U> static yes &chk(type_check<char[sizeof(&U::hello)]> *);
template <typename > static no &chk(...);
static const bool value = sizeof(chk<T>(0)) == sizeof(yes);
};
template<typename T>
void doSomething(T const& t,
typename boost::enable_if_c<has_hello<T>::value>::type* = 0
) {
return t.hello();
}
// Would need another doSomething` for types that don't have hello().
struct Foo {
void hello() const {
std::cout << "hello" << std::endl;
}
};
// This check is ok:
BOOST_STATIC_ASSERT(has_hello<Foo>::value);
int main() {
Foo foo;
doSomething<Foo>(foo);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9lbmFibGVfaWYuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CgovLyBIYXNfaGVsbG88VD46OnZhbHVlIGlzIHRydWUgaWYgVCBoYXMgYSBoZWxsbyBmdW5jdGlvbi4KdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGhhc19oZWxsbyB7CiAgdHlwZWRlZiBjaGFyIHllc1sxXTsKICB0eXBlZGVmIGNoYXIgbm8gWzJdOwogIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdHJ1Y3QgdHlwZV9jaGVjazsKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gc3RhdGljIHllcyAmY2hrKHR5cGVfY2hlY2s8Y2hhcltzaXplb2YoJlU6OmhlbGxvKV0+ICopOwogIHRlbXBsYXRlIDx0eXBlbmFtZSAgPiBzdGF0aWMgbm8gICZjaGsoLi4uKTsKICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihjaGs8VD4oMCkpID09IHNpemVvZih5ZXMpOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBkb1NvbWV0aGluZyhUIGNvbnN0JiB0LAogICAgICAgICAgICAgICAgIHR5cGVuYW1lIGJvb3N0OjplbmFibGVfaWZfYzxoYXNfaGVsbG88VD46OnZhbHVlPjo6dHlwZSogPSAwCiAgICAgICAgICAgICAgICAgKSB7CiAgcmV0dXJuIHQuaGVsbG8oKTsKfQoKLy8gV291bGQgbmVlZCBhbm90aGVyIGRvU29tZXRoaW5nYCBmb3IgdHlwZXMgdGhhdCBkb24ndCBoYXZlIGhlbGxvKCkuCgpzdHJ1Y3QgRm9vIHsKICB2b2lkIGhlbGxvKCkgY29uc3QgewogICAgc3RkOjpjb3V0IDw8ICJoZWxsbyIgPDwgc3RkOjplbmRsOwogIH0KfTsKCi8vIFRoaXMgY2hlY2sgaXMgb2s6CkJPT1NUX1NUQVRJQ19BU1NFUlQoaGFzX2hlbGxvPEZvbz46OnZhbHVlKTsKCmludCBtYWluKCkgewogIEZvbyBmb287CiAgZG9Tb21ldGhpbmc8Rm9vPihmb28pOwp9Cg==