#include <iostream>
template <typename U>
class has_special
{
private:
typedef char yes;
struct no { char c[2]; };
template<typename T> struct dummy;
template<typename T>
static yes check(dummy<typename T::special>*);
template<typename T> static no check(...);
public:
static const bool value = sizeof(check<U>(0)) == sizeof(yes);
};
struct NormalType { };
struct SpecialType { typedef int& special; };
//static_assert(has_special<SpecialType>::value, "");
//static_assert(!has_special<NormalType>::value, "");
template <typename T, bool = has_special<T>::value>
struct DetectSpecial {
void detected() { std::cout << "Not special...\n"; }
};
template <typename T>
struct DetectSpecial<T, true> {
void detected() { std::cout << "Special!\n"; }
};
int main()
{
DetectSpecial<NormalType>().detected();
DetectSpecial<SpecialType>().detected();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFU+CmNsYXNzIGhhc19zcGVjaWFsCnsKcHJpdmF0ZToKICAgIHR5cGVkZWYgY2hhciB5ZXM7CiAgICBzdHJ1Y3Qgbm8geyBjaGFyIGNbMl07IH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGR1bW15OwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0YXRpYyB5ZXMgY2hlY2soZHVtbXk8dHlwZW5hbWUgVDo6c3BlY2lhbD4qKTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0YXRpYyBubyBjaGVjayguLi4pOwpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihjaGVjazxVPigwKSkgPT0gc2l6ZW9mKHllcyk7Cn07CgpzdHJ1Y3QgTm9ybWFsVHlwZSB7IH07CnN0cnVjdCBTcGVjaWFsVHlwZSB7IHR5cGVkZWYgaW50JiBzcGVjaWFsOyB9OwoKLy9zdGF0aWNfYXNzZXJ0KGhhc19zcGVjaWFsPFNwZWNpYWxUeXBlPjo6dmFsdWUsICIiKTsKLy9zdGF0aWNfYXNzZXJ0KCFoYXNfc3BlY2lhbDxOb3JtYWxUeXBlPjo6dmFsdWUsICIiKTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sID0gaGFzX3NwZWNpYWw8VD46OnZhbHVlPgpzdHJ1Y3QgRGV0ZWN0U3BlY2lhbCB7CiAgICB2b2lkIGRldGVjdGVkKCkgeyBzdGQ6OmNvdXQgPDwgIk5vdCBzcGVjaWFsLi4uXG4iOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IERldGVjdFNwZWNpYWw8VCwgdHJ1ZT4gewogICAgdm9pZCBkZXRlY3RlZCgpIHsgc3RkOjpjb3V0IDw8ICJTcGVjaWFsIVxuIjsgfQp9OwoKaW50IG1haW4oKQp7CiAgICBEZXRlY3RTcGVjaWFsPE5vcm1hbFR5cGU+KCkuZGV0ZWN0ZWQoKTsKICAgIERldGVjdFNwZWNpYWw8U3BlY2lhbFR5cGU+KCkuZGV0ZWN0ZWQoKTsKCiAgICByZXR1cm4gMDsKfQo=