#include <iostream>
#include <type_traits>
using namespace std;
class Incomplete;
class Complete { } ;
template < typename IncompleteType>
struct DetermineCompleteHelper : public IncompleteType { } ;
template < typename IncompleteType, typename = std:: enable_if_t < true >>
struct DetermineComplete {
static constexpr const bool value = false ;
} ;
template < typename IncompleteType>
struct DetermineComplete< IncompleteType, std:: enable_if_t < std:: is_same <
decltype( DetermineCompleteHelper< IncompleteType> { } ) ,
decltype( DetermineCompleteHelper< IncompleteType> { } ) > :: value >> {
static constexpr const bool value = true ;
} ;
int main( ) {
cout << DetermineComplete< Complete> :: value << endl;
cout << DetermineComplete< Incomplete> :: value << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSW5jb21wbGV0ZTsKY2xhc3MgQ29tcGxldGUge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5jb21wbGV0ZVR5cGU+CnN0cnVjdCBEZXRlcm1pbmVDb21wbGV0ZUhlbHBlciA6IHB1YmxpYyBJbmNvbXBsZXRlVHlwZSB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBJbmNvbXBsZXRlVHlwZSwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PHRydWU+PgpzdHJ1Y3QgRGV0ZXJtaW5lQ29tcGxldGUgewogICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5jb21wbGV0ZVR5cGU+CnN0cnVjdCBEZXRlcm1pbmVDb21wbGV0ZTxJbmNvbXBsZXRlVHlwZSwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8CiAgICAgICAgZGVjbHR5cGUoRGV0ZXJtaW5lQ29tcGxldGVIZWxwZXI8SW5jb21wbGV0ZVR5cGU+e30pLAogICAgICAgIGRlY2x0eXBlKERldGVybWluZUNvbXBsZXRlSGVscGVyPEluY29tcGxldGVUeXBlPnt9KT46OnZhbHVlPj4gewogICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKfTsKCmludCBtYWluKCkgewogICAgY291dCA8PCBEZXRlcm1pbmVDb21wbGV0ZTxDb21wbGV0ZT46OnZhbHVlIDw8IGVuZGw7CiAgICBjb3V0IDw8IERldGVybWluZUNvbXBsZXRlPEluY29tcGxldGU+Ojp2YWx1ZSA8PCBlbmRsOwogICAgcmV0dXJuIDA7Cn0K
compilation info
prog.cpp: In instantiation of ‘struct DetermineCompleteHelper<Incomplete>’:
prog.cpp:26:42: required from here
prog.cpp:10:8: error: invalid use of incomplete type ‘class Incomplete’
struct DetermineCompleteHelper : public IncompleteType {};
^~~~~~~~~~~~~~~~~~~~~~~
prog.cpp:6:7: note: forward declaration of ‘class Incomplete’
class Incomplete;
^~~~~~~~~~
stdout