#include <stdio.h>
#include <type_traits>
void print()
{
printf("cheers from print !\n");
}
class A
{
public:
void print()
{
printf("cheers from A !\n");
}
};
template<typename Function>
void run(Function& f, std::true_type tag)
{
f();
}
template<typename Object>
void run(Object& o, std::false_type tag)
{
o.print();
}
template<typename T>
void run(T& t)
{
constexpr bool is_fun = std::is_function<typename std::remove_pointer<T>::type >::value;
run(t, std::integral_constant<bool, is_fun>());
}
int main()
{
run(print);
A a;
run(a);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnZvaWQgcHJpbnQoKQp7CiAgICBwcmludGYoImNoZWVycyBmcm9tIHByaW50ICFcbiIpOwp9CgpjbGFzcyBBIAp7CiAgcHVibGljOgogIHZvaWQgcHJpbnQoKQogIHsKICAgICAgcHJpbnRmKCJjaGVlcnMgZnJvbSBBICFcbiIpOwogIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uPgp2b2lkIHJ1bihGdW5jdGlvbiYgZiwgc3RkOjp0cnVlX3R5cGUgdGFnKQp7CiAgIGYoKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0Pgp2b2lkIHJ1bihPYmplY3QmIG8sIHN0ZDo6ZmFsc2VfdHlwZSB0YWcpCnsKICAgby5wcmludCgpOwp9CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBydW4oVCYgdCkKewogICBjb25zdGV4cHIgYm9vbCBpc19mdW4gPSBzdGQ6OmlzX2Z1bmN0aW9uPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8VD46OnR5cGUgPjo6dmFsdWU7CiAgIHJ1bih0LCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX2Z1bj4oKSk7Cn0KCmludCBtYWluKCkKewogICAgcnVuKHByaW50KTsKCiAgICBBIGE7CiAgICBydW4oYSk7CgogICAgcmV0dXJuIDA7Cn0K