Thread overview
Array literal template parameter?
Nov 20, 2012
Maxime Chevalier
Nov 20, 2012
Timon Gehr
Nov 21, 2012
bearophile
Nov 21, 2012
Jacob Carlborg
November 20, 2012
I need to pass an array literal as a template parameter. The reference on this website seems to imply this is possible, but doesn't illustrate it. The obvious way doesn't seem to work:

mixin template MyTemplate(int[] arr) {}
Error: arithmetic/string type expected for value-parameter, not int[]

Is there no way to do this without using a mixin and CTFE? I don't think I can use tuple types because I need to initialize a struct member using the array literal parameter.
November 20, 2012
On 11/21/2012 12:22 AM, Maxime Chevalier wrote:
> I need to pass an array literal as a template parameter. The reference
> on this website seems to imply this is possible, but doesn't illustrate
> it. The obvious way doesn't seem to work:
>
> mixin template MyTemplate(int[] arr) {}
> Error: arithmetic/string type expected for value-parameter, not int[]
>
> Is there no way to do this without using a mixin and CTFE? I don't think
> I can use tuple types because I need to initialize a struct member using
> the array literal parameter.

I guess it should work, and this is a compiler bug. You can work around the limitation by using a template alias parameter.
November 21, 2012
Maxime Chevalier:

> I need to pass an array literal as a template parameter. The reference on this website seems to imply this is possible, but doesn't illustrate it. The obvious way doesn't seem to work:

It's a known compiler bug, already in Bugzilla.

In the meantime this is a workaround:

template Foo(Args...) if (Args.length == 1) {
    pragma(msg, Args[0]);
    enum Foo = Args;
}

void main() {
    enum double[] a = [10, 20, 30];
    auto x = Foo!a;
}


Bye,
bearophile
November 21, 2012
On 2012-11-21 00:22, Maxime Chevalier wrote:
> I need to pass an array literal as a template parameter. The reference
> on this website seems to imply this is possible, but doesn't illustrate
> it. The obvious way doesn't seem to work:
>
> mixin template MyTemplate(int[] arr) {}
> Error: arithmetic/string type expected for value-parameter, not int[]
>
> Is there no way to do this without using a mixin and CTFE? I don't think
> I can use tuple types because I need to initialize a struct member using
> the array literal parameter.

It seems an "alias" parameter is working:

mixin template MyTemplate(alias arr) {}

You might want to add some kind of template constraint on that.

-- 
/Jacob Carlborg