I know that there are many possible ways to detect if a class has a specific function but non of them really work for my exact case. My current implementation to check for t
Here is a way to do it (work for your 4 test cases, did not test it intensively though), thanks @Jarod42 for the improvement (see initial answer at the end):
template
int call_foo (int (T::*)(float));
template
std::true_type has_foo(decltype(call_foo(&C::foo)));
template
std::false_type has_foo (...);
template
using HasFoo = decltype(has_foo(0));
The problem with your code was that you were expecting U::*
whereas &B::foo
is A::*
(not B::*
). Here I let the compiler choose the value of T
by using implicit type deduction so I don't run into such issue.
The code works as follow:
T
does not have a foo
member, then the compiler will choose the second overload of has_foo
.T
does have a foo
member, the compiler will try the first overload but will fail since there is no matching call_foo
function so it will again choose the second one and make a std::false_type
.Working code on ideone: http://ideone.com/erh93I.
You can put everything in a class
if you want:
template
class HasFoo {
template
static int call_foo (int (C::*)(float));
template
static std::true_type has_foo (decltype(call_foo(&C::foo)));
template
static std::false_type has_foo (...);
public:
static constexpr bool value = decltype(has_foo(0)){};
};