Default template arguments

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Mon Nov 19 07:22:31 PST 2012


Suppose I have a template, for which I provide a default parameter type.  Is 
there any way of ensuring that this default will be respected unless the user 
explicitly requests an alternative type?

As an example, consider the following:

//////////////////////////////////////////
import std.stdio;

void printSize(T = real)(T x)
{
       writeln(x.sizeof);
}

void main()
{
       float x;
       x.printSize();
       x.printSize!float();
       x.printSize!real();
}
//////////////////////////////////////////

Here, a default type for T is given -- real -- but passing it a float overrides 
that default, which you can see because the printout of x.sizeof gives the size 
of a float instead of a real.  In other words it outputs

4
4
16

Instead, what I'd like is a way to specify the template parameters so that the 
type would be _real unless otherwise specified_ -- in other words, so that the 
above would output

16
4
16

Reading through http://dlang.org/templates-revisited.html I can't see an evident 
way to do this.  I've tried T:real in place of T = real, but the same behaviour 
results and in any case I don't think that syntax is intended for this kind of 
purpose.  (Actually, the given description of T:int as indicating "T must be int 
type" would suggest that T:real would force T to be a real in all circumstances, 
but that's not what happens ...)


More information about the Digitalmars-d-learn mailing list