Thread overview | |||||
---|---|---|---|---|---|
|
October 06, 2017 template auto deduction | ||||
---|---|---|---|---|
| ||||
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 |
October 06, 2017 Re: template auto deduction | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex | 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
> Alex
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.
-Steve
|
October 06, 2017 Re: template auto deduction | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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.
>
> -Steve
Ha! Yes :)
Thanks a lot :)
That's what is meant by convenience methods inside the library, sometimes...
|
Copyright © 1999-2021 by the D Language Foundation