Template parameter defaults

Jonathan M Davis jmdavisProg at gmx.com
Tue May 31 11:32:19 PDT 2011


On 2011-05-31 10:49, Steven Schveighoffer wrote:
> On Mon, 30 May 2011 09:42:53 -0400, Johann MacDonagh
> 
> <johann.macdonagh..no at spam..gmail.com> wrote:
> > I'm wondering if there's a cleaner way to do this:
> > 
> > class Test(T = uint)
> > {
> > 
> > this(string s)
> > {
> > }
> > 
> > }
> > 
> > void main(string[] argv)
> > {
> > 
> > auto a = new Test!()("test");
> > 
> > }
> > 
> > I'd *like* to be able to do this:
> > 
> > auto a = new Test("test");
> > 
> > and:
> > 
> > auto a = new Test!double("test");
> > 
> > The only possibility I see is to do this:
> > 
> > alias Test!() Test2;
> > 
> > But that introduces two types a user has to decide between. Any ideas?
> > Am I out of luck here?
> 
> Currently, you can omit the template args only in the case of IFTI
> (Implicit Function Template Instantiation) which actually deduces your
> template arguments based on the function call.

I'm not aware of a bugzilla entry on it. I just know that it doesn't work.

- Jonathan M Davis
> 
> I'd argue actually, that IFTI should be extended to constructors:
> 
> class Test(T)
> {
> this(T t) {}
> }
> 
> T t;
> auto a = new Test(1);
> 
> static assert(is(typeof(a) == Test!int));
> 
> Which would also cover your case.
> 
> This should be a no-brainer since a constructor call is almost identical
> in nature to a function call. For sure the overload resolution is the
> same.
> 
> I thought there was a bugzilla entry for this, but I couldn't find it with
> some simple searches, anyone know of one? If not, I'll file one.
> 
> -Steve


More information about the Digitalmars-d-learn mailing list