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