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!
this(string type)(ulong number) {
You cannot do this.
Instead your type should look like this:
First let's change it up a little bit.
struct TestArray(ulong element_n, string type) {
int[element_n] elements;
this(ulong number) {
pragma(msg, "The type is: " ~ typeof(type).stringof);
}
}
Now the above will still not work because you do typeof(type)
which will always yield string because type is as string and also the typeof() is not needed in this case and will actually yield an error.
If it must be a string then you can do it like this:
struct TestArray(ulong element_n, string type) {
int[element_n] elements;
this(ulong number) {
mixin("alias T = " ~ type ~ ";");
pragma(msg, "The type is: " ~ T.stringof);
}
}
However the ideal implementation is probably this:
struct TestArray(ulong element_n, T) {
int[element_n] elements;
this(ulong number) {
pragma(msg, "The type is: " ~ T.stringof);
}
}
To instantiate it you simply do:
TestArray!(10, "int") val = TestArray!(10, "int")(100);
Or
TestArray!(10, int) val = TestArray!(10, int)(100);
I will recommend an alias to make it easier:
alias IntTestArray = TestArray!(10, int);
...
IntTestArray val = IntTestArray(100);