How do I initialize a templated constructor?

WebFreak001 d.forum at webfreak.org
Mon Aug 8 13:25:01 UTC 2022


On Monday, 8 August 2022 at 05:38:31 UTC, rempas wrote:
> In the following struct (as an example, not real code):
>
> ```
> struct TestArray(ulong element_n) {
>   int[element_n] elements;
>
>   this(string type)(ulong number) {
>     pragma(msg, "The type is: " ~ typeof(type).stringof);
>   }
> }
> ```
>
> I want to create it and be able to successfully initialize the 
> template parameters
> of the constructor but until now, I wasn't able to find a way 
> to successfully do
> that. Is there a way you guys know?  I have tried the following:
>
> ```
> void main() {
>   // Doesn't work
>   auto val = TestArray!(10, "int")(60);
>
>   // Doesn't work either
>   auto val = TestArray!(10).TestArray!("int")(60);
>
>   // Neither this works....
>   auto val = TestArray!(10).this!("int")(60);
> }
> ```
>
> As with every question I make, the solution must be "betterC" 
> compatible so I can use it.
> Thanks a lot!

I would move the constructor out of the struct into a helper 
function, either global or as a static member:

```d
TestArray!n testArray(ulong n, string type)(ulong number) {
     TestArray!n ret;
     pragma(msg, "The type is: " ~ typeof(type).stringof);

     ret.something = something; // do your constructor logic here

     return ret;
}
```

which you can then use:

```d
auto t = testArray!(10, "int")(60);
```

As the template parameter being part of the constructor would 
only change the constructor (and can't change anything like types 
outside the ctor) it doesn't have any limitations and if you 
define it in the same module as the struct you can also access 
the private members.


More information about the Digitalmars-d-learn mailing list