Complete example:
std/traits.d:
template AllImplicitConversionTargets(T)
{
static if (is(T == bool))
alias AllImplicitConversionTargets =
AliasSeq!(byte, AllImplicitConversionTargets!byte);
else static if (is(T == byte))
alias AllImplicitConversionTargets =
AliasSeq!(char, ubyte, short, AllImplicitConversionTargets!short);
else static if (is(T == ubyte))
alias AllImplicitConversionTargets =
AliasSeq!(byte, char, short, AllImplicitConversionTargets!short);
else static if (is(T == short))
alias AllImplicitConversionTargets =
AliasSeq!(ushort, wchar, int, AllImplicitConversionTargets!int);
else static if (is(T == ushort))
alias AllImplicitConversionTargets =
AliasSeq!(short, wchar, dchar, AllImplicitConversionTargets!dchar);
else static if (is(T == int))
alias AllImplicitConversionTargets =
AliasSeq!(dchar, uint, long, AllImplicitConversionTargets!long);
else static if (is(T == uint))
alias AllImplicitConversionTargets =
AliasSeq!(dchar, int, long, AllImplicitConversionTargets!long);
else static if (is(T == long))
alias AllImplicitConversionTargets = AliasSeq!(ulong, float, double, real);
else static if (is(T == ulong))
alias AllImplicitConversionTargets = AliasSeq!(long, float, double, real);
else static if (is(T == float))
alias AllImplicitConversionTargets = AliasSeq!(double, real);
else static if (is(T == double))
alias AllImplicitConversionTargets = AliasSeq!(float, real);
else static if (is(T == real))
alias AllImplicitConversionTargets = AliasSeq!(float, double);
else static if (is(T == char))
alias AllImplicitConversionTargets =
AliasSeq!(byte, ubyte, short, AllImplicitConversionTargets!short);
else static if (is(T == wchar))
alias AllImplicitConversionTargets =
AliasSeq!(short, ushort, dchar, AllImplicitConversionTargets!dchar);
else static if (is(T == dchar))
alias AllImplicitConversionTargets =
AliasSeq!(int, uint, long, AllImplicitConversionTargets!long);
else static if (is(T == class))
alias AllImplicitConversionTargets = staticMap!(ApplyLeft!(CopyConstness, T), TransitiveBaseTypeTuple!T);
else static if (is(T == interface))
alias AllImplicitConversionTargets = staticMap!(ApplyLeft!(CopyConstness, T), InterfacesTuple!T);
else static if (isDynamicArray!T && !is(typeof(T.init[0]) == const))
{
static if (is(typeof(T.init[0]) == shared))
alias AllImplicitConversionTargets =
AliasSeq!(const(shared(Unqual!(typeof(T.init[0]))))[]);
else
alias AllImplicitConversionTargets =
AliasSeq!(const(Unqual!(typeof(T.init[0])))[]);
}
else static if (is(T : void*) && !is(T == void*))
alias AllImplicitConversionTargets = AliasSeq!(void*);
else
alias AllImplicitConversionTargets = AliasSeq!();
}