Hi everyone,

I have a struct template which takes an integer n, and then has a constructor taking that many arguments of type long, which looks like:

struct Struct(int n) {
    this(long[n] nums...) { /* stuff */ }
}

This works and lets me change n for each instantiation, but I wanted to make a function to construct it to gain the benefit of not having to write e.g.

Struct!2(1, 2); // 2 could technically be inferred from the number of arguments
Struct!3(1, 2, 3); // similar story

// instead, with a function
makeStruct!(1, 2, 3, etc...); // ideal scenario returning Struct!n for some n

I tried writing this:

auto makeStruct(long[] nums...)() {
    return Struct!(nums.length)(nums);
}

but sadly it seems that the syntax is not recognized, despite the fact that it can be used in the non-template parameter section. I have had to settle for a non-variadic version, which complicates the syntax a little bit:


// non-variadic; negatively affects calling syntax
auto makeStruct(long[] nums)() {
    return Struct!(nums.length)(nums);
}

makeStruct!([1, 2, 3]); // less appealing because of the extra brackets makeStruct![1, 2, 3]; // apparently invalid, despite no obvious conflict


This started out because I just wanted a cleaner-looking constructor, so it's kind of nitpicky, but now I'm just interested in whether this is possible at all. Is there any way to achieve what I'm trying to do without dissecting an AliasSeq? In other words, can I get a type-safe variadic value template parameter without conditionals? If there's anything I've explained inadequately, just ask.

Thanks.

Reply via email to