Re: ? Feature Detection ala JavaScript
Alex Blekhman wrote:
"Victor Bazarov" wrote:
It's possible in templates [...], somewhat.
Just curious, why somewhat? I think you mean this template trick:
typedef char (&no)[1];
typedef char (&yes)[2];
template <typename T, void (T::*)()> struct mem_ptr_helper {};
template <typename T> no has_member_foo_helper(...);
template <typename T>
yes has_member_foo_helper(mem_ptr_helper<T, &T::foo>* p);
template <typename T>
struct has_member_foo
{
const static bool value =
(sizeof(has_member_foo_helper<T>(0)) == sizeof(yes));
};
struct X
{
void foo();
};
if(has_member_foo<X>::value)
{
// X::foo exists
}
I cannot see the situation where it won't work.
The difference between the JavaScript and C++ in this case is that in
C++ it is going to "work" only during compile-time. One can't expect it
to be useful to distinguish between two descendants of the same base
class, for example.
struct B { virtual ~B() {} };
void bar(B& b)
{
if (has_member_foo(b))
// something different
}
struct D1 : B {};
struct D2 : B { void foo(); };
int main(int argc, char *argv[])
{
D1 d1;
D2 d2;
bar(argc > 1 ? d1 : d2);
}
Function 'bar' *has* to have knowledge of *all possible* descendants of
'B' in this case.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask