// DR 339 // // Test of the use of free functions with SFINAE void foo(int) { } template void foo(T*) { } typedef char yes_type; struct no_type { char data[2]; }; template T create_a(); template struct enable_if { typedef T type; }; template struct enable_if { }; template typename enable_if<(sizeof(foo(create_a()), 1) > 0), yes_type>::type check_has_foo(const volatile T&); no_type check_has_foo(...); template struct has_foo { static const bool value = (sizeof(check_has_foo(create_a())) == sizeof(yes_type)); }; struct X { }; int a1[has_foo::value? 1 : -1]; int a2[has_foo::value? 1 : -1]; int a3[has_foo::value? 1 : -1]; int a4[has_foo::value? -1 : 1]; int a5[has_foo::value? -1 : 1];