www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - constructed variadic call

reply Erik Smith <erik cruiserhouse.com> writes:
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
next sibling parent reply Stefan Koch <uplink.coder googlemail.com> writes:
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 02 2016
parent Erik Smith <erik cruiserhouse.com> writes:
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
prev sibling parent reply Alex Parrill <initrd.gz gmail.com> writes:
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
parent Erik Smith <erik cruiserhouse.com> writes:
 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
May 03 2016