#include <iostream>
template < typename T>
struct to_void
{
typedef void type;
} ;
class Foo
{
template < typename T, typename dummy>
friend struct has_TD;
typedef int TD;
} ;
template < typename T, typename dummy = void >
struct has_TD : std:: false_type { } ;
template < typename T>
struct has_TD< T, typename to_void< typename T:: TD > :: type > : std:: true_type { } ;
int main( )
{
std:: cout << std:: boolalpha << has_TD< Foo> :: value << std:: endl ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHRvX3ZvaWQKewoJdHlwZWRlZiB2b2lkIHR5cGU7Cn07CgpjbGFzcyBGb28KewoJdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGR1bW15PgoJZnJpZW5kIHN0cnVjdCBoYXNfVEQ7CgoJdHlwZWRlZiBpbnQgVEQ7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgZHVtbXkgPSB2b2lkPgpzdHJ1Y3QgaGFzX1REIDogc3RkOjpmYWxzZV90eXBlIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBoYXNfVEQ8VCwgdHlwZW5hbWUgdG9fdm9pZDx0eXBlbmFtZSBUOjpURD46OnR5cGUgPiA6IHN0ZDo6dHJ1ZV90eXBle307CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSA8PCBoYXNfVEQ8Rm9vPjo6dmFsdWUgPDwgc3RkOjplbmRsOwp9