#include <iostream>
using namespace std;
template<typename ...>
struct void_type
{
using type = void;
};
template<typename ...T>
using void_t = typename void_type<T...>::type;
#define HAS_TYPE(NAME) \
template<typename, typename = void> \
struct has_type_##NAME: std::false_type \
{}; \
template<typename T> \
struct has_type_##NAME<T, void_t<typename T::NAME>>: std::true_type \
{}
HAS_TYPE(MyType);
template<typename T, bool = has_type_MyType<T>::value>
struct MyTypeOrTupple_impl;
template<typename T>
struct MyTypeOrTupple_impl<T, true>
{ using type = typename T::MyType; };
template<typename T>
struct MyTypeOrTupple_impl<T, false>
{ using type = std::tuple<>; };
template<typename T> using MyTypeOrTupple = typename MyTypeOrTupple_impl<T>::type;
struct A
{
using MyType = int;
};
struct B {};
int main()
{
static_assert(std::is_same<MyTypeOrTupple<A>, A::MyType>{}, "!");
static_assert(std::is_same<MyTypeOrTupple<B>, std::tuple<>>{}, "!");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uPgpzdHJ1Y3Qgdm9pZF90eXBlCnsKICAgIHVzaW5nIHR5cGUgPSB2b2lkOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uVD4KdXNpbmcgdm9pZF90ID0gdHlwZW5hbWUgdm9pZF90eXBlPFQuLi4+Ojp0eXBlOwoKI2RlZmluZSBIQVNfVFlQRShOQU1FKSBcCnRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZSA9IHZvaWQ+IFwKc3RydWN0IGhhc190eXBlXyMjTkFNRTogc3RkOjpmYWxzZV90eXBlIFwKe307IFwKdGVtcGxhdGU8dHlwZW5hbWUgVD4gXApzdHJ1Y3QgaGFzX3R5cGVfIyNOQU1FPFQsIHZvaWRfdDx0eXBlbmFtZSBUOjpOQU1FPj46IHN0ZDo6dHJ1ZV90eXBlIFwKe30KCkhBU19UWVBFKE15VHlwZSk7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sID0gaGFzX3R5cGVfTXlUeXBlPFQ+Ojp2YWx1ZT4Kc3RydWN0IE15VHlwZU9yVHVwcGxlX2ltcGw7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgTXlUeXBlT3JUdXBwbGVfaW1wbDxULCB0cnVlPgp7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBUOjpNeVR5cGU7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgTXlUeXBlT3JUdXBwbGVfaW1wbDxULCBmYWxzZT4KeyB1c2luZyB0eXBlID0gc3RkOjp0dXBsZTw+OyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gdXNpbmcgTXlUeXBlT3JUdXBwbGUgPSB0eXBlbmFtZSBNeVR5cGVPclR1cHBsZV9pbXBsPFQ+Ojp0eXBlOwoKc3RydWN0IEEKewogICAgdXNpbmcgTXlUeXBlID0gaW50Owp9OwoKc3RydWN0IEIge307CgppbnQgbWFpbigpCnsKICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPE15VHlwZU9yVHVwcGxlPEE+LCBBOjpNeVR5cGU+e30sICIhIik7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxNeVR5cGVPclR1cHBsZTxCPiwgc3RkOjp0dXBsZTw+Pnt9LCAiISIpOwp9CgoK