Closest Common Type
BCS
ao at pathlink.com
Fri May 16 13:23:05 PDT 2008
with a little insight from #D:
template ExtractClass(T...)
{
static if(T.length > 0)
{
static if(is(T[0] P == class)) alias P ExtractClass;
else alias ExtractClass!(T[1..$]) ExtractClass;
}
else static assert(false);
}
template BaseClass(T)
{
static if(is(T _ == class) && !is(_ == Object) && is(T BaseT == super))
alias ExtractClass!(BaseT) BaseClass;
else static assert(false);
}
template CCT2(T,U)
{
static if(is(T _ == class) && is(U __ == class))
{
static if (is(T : U)) alias U CCT2;
else static if (is(U : T)) alias T CCT2;
else alias CCT2!(BaseClass!(T),U) CCT2;
}
else static assert(false);
}
template CCT(T...)
{
static if(T.length > 1) alias CCT!(CCT2!(T[0..2]), T[2..$]) CCT;
else static if(T.length == 1) alias T[0] CCT;
else static assert(false);
}
class A {}
class B : A {}
class C : A {}
class D : C {}
class E : C {}
class F {}
static assert(is(CCT!(E, D) == C));
static assert(is(CCT!(E, C) == C));
static assert(is(CCT!(E, B) == A));
static assert(is(CCT!(E, A) == A));
static assert(is(CCT!(E, F) == Object));
More information about the Digitalmars-d-learn
mailing list