1 // Origin: PR c++/46162 2 3 struct small_type { char dummy; }; 4 struct large_type { char dummy[2]; }; 5 6 template<class T> 7 struct has_foo_member_variable 8 { 9 template<int T::*> struct tester; 10 template<class U> static small_type has_foo(tester<&U::foo> *); 11 template<class U> static large_type has_foo(...); 12 static const bool value = (sizeof(has_foo<T>(0)) == sizeof(small_type)); 13 }; 14 15 struct A 16 { fooA17 static int foo() 18 { 19 return 0; 20 } 21 }; 22 23 struct B 24 { 25 static int foo; 26 }; 27 28 void bar()29bar() 30 { 31 bool b = has_foo_member_variable<A>::value; 32 } 33 34