Interfaces and Template Specializations

Björn T. Herzig raichoo at googlemail.com
Sat Jan 10 12:51:57 PST 2009


Hi,

I've been trying out D lately and stumbled upon the following problem.

I have 2 interfaces:

interface Plugable
{
	public void plug();
}

interface Printable
{
	public void print();
}

and two classes that implement those named Test which implements Plugable and Printable, and Test2 which only implements Plugable.

I now want to create a generic function with two specializations.

void tester(U)(U u) if (is(U : Plugable) && is(U : Printable))
{
	writefln("U : Printable, Plugable");
	u.plug();
	u.print();
}

void tester(U : Printable)(U u)
{
	writefln("U : printable");
	u.print();
}

First of all this doesn't compile with the dmd 2.014 compiler since it doesn't accept the if statement after the template declaration (Or did I do something wrong?). Another thing is that it's really weird syntax. In the second specialization it's enough to write U : Plugable but it's not possible to write something like void tester(U : Printable, Plugable)(U u) since Plugable would be handled as a second template parameter (or am I mistaken?). Wouldn't it be much nicer if you could write something like this : void tester(U : (Plugable, Printable))(U u) and void tester(U : (Plugable))(U u)? This way it would be possible to use a unified syntax for both cases without the need for a special case with the if-statement.

Btw, are there plans to port dmd to Solaris/OpenSolaris? Since it's my main OS i would really like to use D on that platform.

Regards,
Björn



More information about the Digitalmars-d mailing list