Re: constructed variadic call

2016-05-03 Thread Erik Smith via Digitalmars-d-learn
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




Re: constructed variadic call

2016-05-03 Thread Alex Parrill via Digitalmars-d-learn

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


Re: constructed variadic call

2016-05-03 Thread Erik Smith via Digitalmars-d-learn

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


Re: constructed variadic call

2016-05-02 Thread Stefan Koch via Digitalmars-d-learn

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.



constructed variadic call

2016-05-02 Thread Erik Smith via Digitalmars-d-learn
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;
...
}