#include <iostream>
template< typename t >
typename std::enable_if< sizeof (t), std::true_type >::type
is_complete_fn( t * );
std::false_type is_complete_fn( ... );
template< typename t, bool value = decltype( is_complete_fn( (t *) nullptr ) )::value >
struct is_complete : std::integral_constant< bool, value > {};
void a() {
struct q;
std::cout << is_complete< q >::value << '\n';
struct q {};
std::cout << is_complete< q >::value << '\n';
}
int main() {
std::cout.setf( std::ios::boolalpha );
a();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8IHR5cGVuYW1lIHQgPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgc2l6ZW9mICh0KSwgc3RkOjp0cnVlX3R5cGUgPjo6dHlwZQppc19jb21wbGV0ZV9mbiggdCAqICk7CgpzdGQ6OmZhbHNlX3R5cGUgaXNfY29tcGxldGVfZm4oIC4uLiApOwoKdGVtcGxhdGU8IHR5cGVuYW1lIHQsIGJvb2wgdmFsdWUgPSBkZWNsdHlwZSggaXNfY29tcGxldGVfZm4oICh0ICopIG51bGxwdHIgKSApOjp2YWx1ZSA+CnN0cnVjdCBpc19jb21wbGV0ZSA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8IGJvb2wsIHZhbHVlID4ge307Cgp2b2lkIGEoKSB7CglzdHJ1Y3QgcTsKICAgIHN0ZDo6Y291dCA8PCBpc19jb21wbGV0ZTwgcSA+Ojp2YWx1ZSA8PCAnXG4nOwogICAgc3RydWN0IHEge307CiAgICBzdGQ6OmNvdXQgPDwgaXNfY29tcGxldGU8IHEgPjo6dmFsdWUgPDwgJ1xuJzsKfQoKCmludCBtYWluKCkgewogICAgc3RkOjpjb3V0LnNldGYoIHN0ZDo6aW9zOjpib29sYWxwaGEgKTsKICAgIGEoKTsKfQ==