Interfaces and Template Specializations

Jarrett Billingsley jarrett.billingsley at gmail.com
Sat Jan 10 17:21:28 PST 2009


On Sat, Jan 10, 2009 at 8:10 PM, Björn T. Herzig <raichoo at googlemail.com> wrote:
> 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
>

Go to the changelog.

http://www.digitalmars.com/d/2.0/changelog.html



More information about the Digitalmars-d mailing list