www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Template not seeming to instantiate a second time with default alias

reply wobbles <grogan.colin gmail.com> writes:
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?
Aug 30 2016
parent reply ag0aep6g <anonymous example.com> writes:
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
Aug 30 2016
parent reply wobbles <grogan.colin gmail.com> writes:
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 :/
Aug 30 2016
next sibling parent reply ag0aep6g <anonymous example.com> writes:
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); ----
Aug 30 2016
parent wobbles <grogan.colin gmail.com> writes:
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!
Aug 31 2016
prev sibling parent ag0aep6g <anonymous example.com> writes:
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) {/* ... */} ----
Aug 30 2016