Interfaces and Template Specializations
Björn T. Herzig
raichoo at googlemail.com
Sat Jan 10 17:10:56 PST 2009
dsimcha Wrote:
> == Quote from Björn_T._Herzig (raichoo at googlemail.com)'s article
> > 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?).
>
> http://digitalmars.com/d/2.0/changelog.html#new2_015
>
> This syntax is called constraints. It didn't exist before 2.015. The info on
> some pages is outdated. The latest DMD version is 2.023.
>
> > 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.
>
> The weird syntax is because the first case is a constraint and the second is a
> template specialization. For consistency, it might be better to just use
> constraints for everything.
>
> Overall, though, D2's compile-time reflection system grew very organically and has
> a lot of duplicated features. There's been some discussion in the past about how
> to reduce this complexity by removing redundancy. You may have stumbled on one
> here: Constraints, as far as I can tell, are just a more general case of template
> specialization. Maybe we don't need template specialization anymore.
Thanks,
where can I get that version? I'm currently using dmd_2.014-052208_i386.deb from the download page. never saw a newer version. Right now my only possibility to use D is inside of an ubuntu vm which is not really the greatest way... i'd really like to know if dmd will be ported to Solaris.
Regards,
Björn
More information about the Digitalmars-d
mailing list