View mode: basic / threaded / horizontal-split · Log in · Help
January 18, 2006
Adding concepts to D
Currently, to specialize on a concept, something like the following must 
be done:

template isDog( T ) {
    const bit isDog = is(T:Scottie) || is(T:Daschund);
}

template walkAnimal( T, bit check : true = isDog!( T ) ) {
    walkAnimal( T animal ) {
        // make sure the user didn't try to trick me
        static assert( isDog!( T ) );

        getDoggieBiscuits();
        walkDog();
    }
}

template walkAnimal( T, bit check : false ) {
    walkAnimal( T animal ) {
        // make sure the user didn't try to trick me
        static assert( !isDog!( T ) );

        putOnRunningShoes();
        getBigStick();
        walkNastyCritter();
    }
}

This is a bit awkward for simple cases and can easily become quite 
complex.  Also, it is unappealing that the concept checking currently 
must be done via template parameters, which can be overridden by the 
clever user.  C++ 0x will support concepts in some form both to aid in 
error reporting and to simplify trait-based specialization, and it would 
be tremendously useful for D to have something similar.  Also, I think D 
is already is very good shape for supporting this, as static if, is, 
etc, provide an existing, straightforward means to switch on type 
attributes.

The C++ proposals are outlined in various forms here:

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1899.pdf
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1886.pdf
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1849.pdf

The key concept in each proposal is a 'where' clause that is separated 
from the list of template parameters.  I won't pretend to know how this 
would best fit into the D syntax however.


Sean
Top | Discussion index | About this forum | D home