Thread overview
constructed variadic call
May 02, 2016
Erik Smith
May 02, 2016
Stefan Koch
May 03, 2016
Erik Smith
May 03, 2016
Alex Parrill
May 03, 2016
Erik Smith
May 02, 2016
Is there way to construct an "argument pack" from a non-static array (like the switch below)?  I need to transport a variadic call through a void*.

switch (a.length) {
  case 1: foo(a[1]); break;
  case 2: foo(a[1], a[2]); break;
  case 3: foo(a[1], a[2], a[3]); break;
...
}

May 02, 2016
On Monday, 2 May 2016 at 18:22:52 UTC, Erik Smith wrote:
> Is there way to construct an "argument pack" from a non-static array (like the switch below)?  I need to transport a variadic call through a void*.
>
> switch (a.length) {
>   case 1: foo(a[1]); break;
>   case 2: foo(a[1], a[2]); break;
>   case 3: foo(a[1], a[2], a[3]); break;
> ...
> }

Yes there is.
Using a string mixin.

May 03, 2016
On Monday, 2 May 2016 at 18:56:59 UTC, Stefan Koch wrote:
> On Monday, 2 May 2016 at 18:22:52 UTC, Erik Smith wrote:
>> Is there way to construct an "argument pack" from a non-static array (like the switch below)?  I need to transport a variadic call through a void*.
>>
>> switch (a.length) {
>>   case 1: foo(a[1]); break;
>>   case 2: foo(a[1], a[2]); break;
>>   case 3: foo(a[1], a[2], a[3]); break;
>> ...
>> }
>
> Yes there is.
> Using a string mixin.

I'm not sure how to apply mixins here because they require compile time evaluation and a.length is runtime.  Ideas?

erik
May 03, 2016
On Monday, 2 May 2016 at 18:22:52 UTC, Erik Smith wrote:
> Is there way to construct an "argument pack" from a non-static array (like the switch below)?  I need to transport a variadic call through a void*.
>
> switch (a.length) {
>   case 1: foo(a[1]); break;
>   case 2: foo(a[1], a[2]); break;
>   case 3: foo(a[1], a[2], a[3]); break;
> ...
> }

I don't think it's possible to call a vararg function whose number of arguments is only known at runtime, for the same reasons it is impossible in C [1].

Your switch statement is probably the best you can do, other than rewriting the API to not use varargs (which, depending on what the function is doing, I would recommend). You can possibly use string mixins or static foreach to avoid repeating the case clauses.

[1] Populating a va_list: http://stackoverflow.com/questions/988290/populating-a-va-list
May 03, 2016
> I don't think it's possible to call a vararg function whose number of arguments is only known at runtime, for the same reasons it is impossible in C [1].
>
> Your switch statement is probably the best you can do, other than rewriting the API to not use varargs (which, depending on what the function is doing, I would recommend). You can possibly use string mixins or static foreach to avoid repeating the case clauses.
>
> [1] Populating a va_list: http://stackoverflow.com/questions/988290/populating-a-va-list

That was fast :).  The generation idea helps a little - thanks.  It works though and I can't use va_list in this case.

erik