digitalmars.D.learn - template auto deduction
- Alex (34/34) Oct 06 2017 Hey, template gurus :)
- Steven Schveighoffer (13/52) Oct 06 2017 What you need is IFTI or "Implicit Function Template Instantiation"
- Alex (6/20) Oct 06 2017 Ha! Yes :)
Hey, template gurus :) given this: struct M(alias I : S!E, alias S, E...) { R!E r; this(S)(S initStruct) // line 4 { r = R!E(initStruct); } } struct R(E...) { this(S)(S initStruct) // line 12 { // do some cool stuff } } void main() { FS!(Etype1) fs; auto m = M!(typeof(fs))(fs); // line 21. auto a = M!(fs); // does not work auto b = M(fs); // does not work } struct FS(T...){} struct Etype1{} Everything works as expected, especially line 21. The question is about syntactic sugar: What I have to change, to use auto deduction and to create the M struct like in line 22 or 23? By the way, I'm aware, that the type matching in lines 4 and 12 is lost, in the way it is written here. However, it is meant to exist, if this helps in some way... Thanks a lot in advance Alex
Oct 06 2017
On 10/6/17 5:08 PM, Alex wrote:Hey, template gurus :) given this: struct M(alias I : S!E, alias S, E...) { R!E r; this(S)(S initStruct) // line 4 { r = R!E(initStruct); } } struct R(E...) { this(S)(S initStruct) // line 12 { // do some cool stuff } } void main() { FS!(Etype1) fs; auto m = M!(typeof(fs))(fs); // line 21. auto a = M!(fs); // does not work auto b = M(fs); // does not work } struct FS(T...){} struct Etype1{} Everything works as expected, especially line 21. The question is about syntactic sugar: What I have to change, to use auto deduction and to create the M struct like in line 22 or 23? By the way, I'm aware, that the type matching in lines 4 and 12 is lost, in the way it is written here. However, it is meant to exist, if this helps in some way... Thanks a lot in advance AlexWhat you need is IFTI or "Implicit Function Template Instantiation" Note the "Function" part of it, in that it's only valid for functions. So you need a factory function: auto m(T)(T x) { return M!(T)(x); } ... auto b = m(fs); // ok There is an enhancement request to make constructors have the same mechanism. Not sure if or when it would be implemented. -Steve
Oct 06 2017
On Friday, 6 October 2017 at 21:42:40 UTC, Steven Schveighoffer wrote:What you need is IFTI or "Implicit Function Template Instantiation" Note the "Function" part of it, in that it's only valid for functions. So you need a factory function: auto m(T)(T x) { return M!(T)(x); } ... auto b = m(fs); // ok There is an enhancement request to make constructors have the same mechanism. Not sure if or when it would be implemented. -SteveHa! Yes :) Thanks a lot :) That's what is meant by convenience methods inside the library, sometimes...
Oct 06 2017