#include <iostream>
struct NormalType { };
struct SpecialType { typedef int special; };
template <typename T, typename IsSpecial = void>
struct DetectSpecial {
void detected() { std::cout << "Not special...\n"; }
};
template <typename T>
struct DetectSpecial<T, typename T::special> {
void detected() { std::cout << "Special!\n"; }
};
int main() {
DetectSpecial<NormalType>().detected();
DetectSpecial<SpecialType>().detected();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE5vcm1hbFR5cGUgeyB9OwoKc3RydWN0IFNwZWNpYWxUeXBlIHsgdHlwZWRlZiBpbnQgc3BlY2lhbDsgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJc1NwZWNpYWwgPSB2b2lkPgpzdHJ1Y3QgRGV0ZWN0U3BlY2lhbCB7Cgl2b2lkIGRldGVjdGVkKCkgeyBzdGQ6OmNvdXQgPDwgIk5vdCBzcGVjaWFsLi4uXG4iOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IERldGVjdFNwZWNpYWw8VCwgdHlwZW5hbWUgVDo6c3BlY2lhbD4gewoJdm9pZCBkZXRlY3RlZCgpIHsgc3RkOjpjb3V0IDw8ICJTcGVjaWFsIVxuIjsgfQp9OwoKaW50IG1haW4oKSB7CglEZXRlY3RTcGVjaWFsPE5vcm1hbFR5cGU+KCkuZGV0ZWN0ZWQoKTsKCURldGVjdFNwZWNpYWw8U3BlY2lhbFR5cGU+KCkuZGV0ZWN0ZWQoKTsKCXJldHVybiAwOwp9