// Traits class that determines if a given type has
// a static data member named "f".

#include <cassert>

struct A { static int f; };
struct B { static int g; };
struct C { int f; };


template < int >
struct Test { char c[2]; };

template < typename U >
static Test< sizeof(U::f) > test_f(U const&);

static char test_f(...);

template < typename T >
struct Has_static_data_member_named_f {
  enum { value = sizeof( test_f(*((T*)0)) ) != 1 };
};

int main() {
  assert(  Has_static_data_member_named_f<A>::value);
  assert(! Has_static_data_member_named_f<B>::value);
  assert(! Has_static_data_member_named_f<C>::value);
  assert(! Has_static_data_member_named_f<double>::value);
}

