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