D's type classes pattern ?

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 24 15:52:54 PDT 2015


On Tuesday, 24 March 2015 at 16:56:13 UTC, matovitch wrote:
> Thanks, just to be clear :
>
> void Bar(T : Foo)(T t){
> }
>
> is the same as
>
> void Bar(T)(T t) if (is(T == Foo)){
> }
>
> and it is checked only at compile time ? (for the runtime I 
> know that what interface were meant for ;)).

Ali already mentioned the difference between "==" and ":".

In addition to that, template specializations (like `Bar(T : 
Foo)(T t)`) and template constraints (like `Bar(T)(T t) if(is(T : 
Foo))`) are similar but generally not interchangeable.

A template with a specialization is considered a better match 
than one without. Whereas a template constraint doesn't add to 
the quality of the match.

An example:

module test;
import std.stdio;

void f(T)(T t) {writeln("generic");}
void f(T : int)(T t) {writeln("with specialization");}
void f(T)(T t) if(is(T : Object)) {writeln("with constraint");}

void main()
{
     f("some string"); /* -> "generic" */
     f(42); /* -> "with specialization" */
     version(none) f(new Object); /* Doesn't compile, because it 
matches both the generic version and the one with the constraint. 
*/
}


More information about the Digitalmars-d-learn mailing list