#include <string>
#include <type_traits>
class Object{ } ;
enum my_conv {
string, const_object, object
} ;
template < typename T, typename V = void >
struct deducer;
template < typename T>
struct deducer< T, typename std:: enable_if < std:: is_constructible < std:: string , T> :: value > :: type > {
static const my_conv value = my_conv:: string ;
} ; // (1) test for string
template < typename T>
struct deducer< T, typename std:: enable_if < std:: is_assignable < Object* & , T> :: value > :: type > {
static const my_conv value = my_conv:: object ;
} ; // (2) test for Object derived
template < typename T>
struct deducer< const T, typename std:: enable_if < std:: is_assignable < Object* & , T> :: value > :: type > {
static const my_conv value = my_conv:: const_object ;
} ; // (3) should test for const Object derived
class Test : public Object {
public :
Test( ) = default ;
} ;
int main( ) {
std:: string str;
Test* t = new Test;
const Test* tconst = static_cast < const Test* > ( t) ;
deducer< decltype( t) > :: value ; // deduce as (1)
deducer< decltype( str) > :: value ; //deduce as (2)
deducer< decltype( tconst) > :: value ; //fail to deduce as (1)... why?
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKY2xhc3MgT2JqZWN0e307CgplbnVtIG15X2NvbnYgewogIHN0cmluZywgY29uc3Rfb2JqZWN0LCBvYmplY3QKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFYgPSB2b2lkPgpzdHJ1Y3QgZGVkdWNlcjsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBkZWR1Y2VyPFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8c3RkOjpzdHJpbmcsIFQ+Ojp2YWx1ZSA+Ojp0eXBlID4gewogIHN0YXRpYyBjb25zdCBteV9jb252IHZhbHVlID0gbXlfY29udjo6c3RyaW5nOwp9OyAvLyAoMSkgdGVzdCBmb3Igc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGRlZHVjZXI8VCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IHN0ZDo6aXNfYXNzaWduYWJsZTxPYmplY3QqJiwgVD46OnZhbHVlID46OnR5cGUgPiB7CiAgc3RhdGljIGNvbnN0IG15X2NvbnYgdmFsdWUgPSBteV9jb252OjpvYmplY3Q7Cn07IC8vICgyKSB0ZXN0IGZvciBPYmplY3QgZGVyaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgZGVkdWNlcjxjb25zdCBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgc3RkOjppc19hc3NpZ25hYmxlPE9iamVjdComLCBUPjo6dmFsdWUgPjo6dHlwZSA+IHsKICBzdGF0aWMgY29uc3QgbXlfY29udiB2YWx1ZSA9IG15X2NvbnY6OmNvbnN0X29iamVjdDsKfTsgLy8gKDMpIHNob3VsZCB0ZXN0IGZvciBjb25zdCBPYmplY3QgZGVyaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCmNsYXNzIFRlc3QgOiBwdWJsaWMgT2JqZWN0IHsKcHVibGljOgogIFRlc3QoKSA9IGRlZmF1bHQ7Cn07CgppbnQgbWFpbigpIHsKICBzdGQ6OnN0cmluZyAgIHN0cjsKICBUZXN0KiAgICAgICAgIHQgPSBuZXcgVGVzdDsKICBjb25zdCBUZXN0KiAgIHRjb25zdCA9IHN0YXRpY19jYXN0PGNvbnN0IFRlc3QqPih0KTsKCiAgZGVkdWNlcjxkZWNsdHlwZSh0KT46OnZhbHVlOy8vIGRlZHVjZSBhcyAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgZGVkdWNlcjxkZWNsdHlwZShzdHIpPjo6dmFsdWU7Ly9kZWR1Y2UgYXMgKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgZGVkdWNlcjxkZWNsdHlwZSh0Y29uc3QpPjo6dmFsdWU7Ly9mYWlsIHRvIGRlZHVjZSBhcyAoMSkuLi4gd2h5PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0=