#include <type_traits>
using namespace std;
template < typename T>
class has_CompareTo_self
{
typedef char one[ 1 ] ;
typedef char two[ 2 ] ;
template < typename C, C> struct type_check;
template < typename C> static one& test( type_check< int ( C:: * ) ( C& ) , & C:: CompareTo > * ) ;
template < typename > static two& test( ...) ;
public :
enum { value = sizeof ( test< T> ( 0 ) ) == sizeof ( one) } ;
} ;
template < class _Ty> class Array
{
static_assert( has_CompareTo_self< _Ty> :: value , "no appropriate CompareTo found" ) ;
} ;
class Good
{
public :
int CompareTo( Good& other) ;
} ;
class Bad
{
public :
long CompareTo( Bad& other) ;
} ;
int main( )
{
Array< Good> a;
Array< Bad> b;
return 0 ;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBoYXNfQ29tcGFyZVRvX3NlbGYKewogICAgdHlwZWRlZiBjaGFyIG9uZVsxXTsKICAgIHR5cGVkZWYgY2hhciB0d29bMl07CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEMsIEM+IHN0cnVjdCB0eXBlX2NoZWNrOwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDPiBzdGF0aWMgb25lJiB0ZXN0KCB0eXBlX2NoZWNrPGludCAoQzo6KikoQyYpLCAmQzo6Q29tcGFyZVRvPiogKSA7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0YXRpYyB0d28mIHRlc3QoLi4uKTsKCnB1YmxpYzoKICAgIGVudW0geyB2YWx1ZSA9IHNpemVvZih0ZXN0PFQ+KDApKSA9PSBzaXplb2Yob25lKSB9Owp9OwoKdGVtcGxhdGU8Y2xhc3MgX1R5PiBjbGFzcyBBcnJheQp7CglzdGF0aWNfYXNzZXJ0KGhhc19Db21wYXJlVG9fc2VsZjxfVHk+Ojp2YWx1ZSwgIm5vIGFwcHJvcHJpYXRlIENvbXBhcmVUbyBmb3VuZCIpOwp9OwoKY2xhc3MgR29vZAp7CnB1YmxpYzoKICAgIGludCBDb21wYXJlVG8oR29vZCYgb3RoZXIpOwp9OwoKY2xhc3MgQmFkCnsKcHVibGljOgogICAgbG9uZyBDb21wYXJlVG8oQmFkJiBvdGhlcik7Cn07CgoKaW50IG1haW4oKQp7CglBcnJheTxHb29kPiBhOwoJQXJyYXk8QmFkPiBiOwoJcmV0dXJuIDA7Cn0=
compilation info
prog.cpp: In instantiation of 'class Array<Bad>':
prog.cpp:41:13: required from here
prog.cpp:22:2: error: static assertion failed: no appropriate CompareTo found
static_assert(has_CompareTo_self<_Ty>::value, "no appropriate CompareTo found");
^
stdout