Thread overview
Template not seeming to instantiate a second time with default alias parameter
Aug 30, 2016
wobbles
Aug 30, 2016
ag0aep6g
Aug 30, 2016
wobbles
Aug 30, 2016
ag0aep6g
Aug 31, 2016
wobbles
Aug 30, 2016
ag0aep6g
August 30, 2016
Hi,

Code here:
https://gist.github.com/grogancolin/066a8a8c105fa473dfee961e2481a30e

Basically, it seems when a template has an alias parameter like

class Node(T, alias func = (T t => t*t))(){
//whatever
}

//instantiate
Node!(int) intNode;
Node!(float) floatNode;   // fails as lambda func expects an int.

Am I doing something wrong or is this a bug?
August 30, 2016
On 08/30/2016 10:41 PM, wobbles wrote:
> class Node(T, alias func = (T t => t*t))(){
> //whatever
> }
>
> //instantiate
> Node!(int) intNode;
> Node!(float) floatNode;   // fails as lambda func expects an int.
>
> Am I doing something wrong or is this a bug?

Proper test case:

----
class Node(T, alias func = (T t) => t*t)
{
    void method() { func(T.init); }
}

//instantiate
Node!(int) intNode;
Node!(float) floatNode;   // fails as lambda func expects an int.
----

Looks like a bug to me. Similar to this:
https://issues.dlang.org/show_bug.cgi?id=14501
August 30, 2016
On Tuesday, 30 August 2016 at 20:55:20 UTC, ag0aep6g wrote:
> On 08/30/2016 10:41 PM, wobbles wrote:
>> class Node(T, alias func = (T t => t*t))(){
>> //whatever
>> }
>>
>> //instantiate
>> Node!(int) intNode;
>> Node!(float) floatNode;   // fails as lambda func expects an int.
>>
>> Am I doing something wrong or is this a bug?
>
> Proper test case:
>
> ----
> class Node(T, alias func = (T t) => t*t)
> {
>     void method() { func(T.init); }
> }
>
> //instantiate
> Node!(int) intNode;
> Node!(float) floatNode;   // fails as lambda func expects an int.
> ----
>
> Looks like a bug to me. Similar to this:
> https://issues.dlang.org/show_bug.cgi?id=14501

Yeah. Looks related.

I'll have to try find a workaround for now :/
August 30, 2016
On 08/30/2016 11:28 PM, wobbles wrote:
> I'll have to try find a workaround for now :/

This seems to work and isn't too ugly:

----
class Node(T, alias func) {/*...*/}
alias Node(T) = Node!(T, (T t) => t*t);
----
August 30, 2016
On 08/30/2016 11:28 PM, wobbles wrote:
> I'll have to try find a workaround for now :/

This also seems to work, but has a slightly different meaning:

----
class Node(T, alias func = t => t*t) {/* ... */}
----

The default func is a template here. Equivalent to this:

----
auto square(T)(T t) { return t*t; }
class Node(T, alias func = square) {/* ... */}
----

August 31, 2016
On Tuesday, 30 August 2016 at 21:35:29 UTC, ag0aep6g wrote:
> On 08/30/2016 11:28 PM, wobbles wrote:
>> I'll have to try find a workaround for now :/
>
> This seems to work and isn't too ugly:
>
> ----
> class Node(T, alias func) {/*...*/}
> alias Node(T) = Node!(T, (T t) => t*t);
> ----

Excellent - thanks for these.
This one will work for me :)

I was going to do something messy with a nested template and some static ifs. But, complicated things are complicated. This is much easier.
Thanks!