#include <iostream>
#include <type_traits>
struct A {
using my_tag = void;
};
struct B {};
struct C {
using my_tag = int; // with void_t also works with my_tag = int
};
struct D {
struct my_tag{}; //or some tested struct
};
// same as your enable_if_type
template <typename...>
using void_t = void;
template<class T, class Enable = void>
struct has_my_tag : std::false_type {};
template<class T>
struct has_my_tag<T, void_t<typename T::my_tag>> : std::true_type
{};
int main() {
std::cout << has_my_tag<A>::value << std::endl;
std::cout << has_my_tag<B>::value << std::endl;
std::cout << has_my_tag<C>::value << std::endl;
std::cout << has_my_tag<D>::value << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgoKc3RydWN0IEEgewogIHVzaW5nIG15X3RhZyA9IHZvaWQ7Cn07CgpzdHJ1Y3QgQiB7fTsKCnN0cnVjdCBDIHsKICB1c2luZyBteV90YWcgPSBpbnQ7IC8vIHdpdGggdm9pZF90IGFsc28gd29ya3Mgd2l0aCBteV90YWcgPSBpbnQKfTsKCnN0cnVjdCBEIHsKICBzdHJ1Y3QgbXlfdGFne307IC8vb3Igc29tZSB0ZXN0ZWQgc3RydWN0Cn07CgovLyBzYW1lIGFzIHlvdXIgZW5hYmxlX2lmX3R5cGUKdGVtcGxhdGUgPHR5cGVuYW1lLi4uPgp1c2luZyB2b2lkX3QgPSB2b2lkOwoKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEVuYWJsZSA9IHZvaWQ+CnN0cnVjdCBoYXNfbXlfdGFnIDogc3RkOjpmYWxzZV90eXBlIHt9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IGhhc19teV90YWc8VCwgdm9pZF90PHR5cGVuYW1lIFQ6Om15X3RhZz4+IDogc3RkOjp0cnVlX3R5cGUKe307CgoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgaGFzX215X3RhZzxBPjo6dmFsdWUgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGhhc19teV90YWc8Qj46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBoYXNfbXlfdGFnPEM+Ojp2YWx1ZSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgaGFzX215X3RhZzxEPjo6dmFsdWUgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=