How to send variadic arguments

Zarathustra adam.chrapkowski at gmail.com
Mon Aug 25 09:43:26 PDT 2008


Steven Schveighoffer Wrote:

> "Zarathustra" wrote
> > Steven Schveighoffer Wrote:
> >
> >> The way it is done in Tango is to put the implementation in a function 
> >> which
> >> takes the _argptr and _arguments as parameters.  Then the actual variadic
> >> function is just a wrapper.  If you want to chain another variadic 
> >> function
> >> to it, just pass the _argptr and _arguments.
> >>
> >> Passing the argptr and arguments directly really should be a compiler
> >> supported thing, as this is all you are doing anyways.  Similar to how 
> >> you
> >> can call opX directly.
> >>
> >> -Steve
> >>
> >>
> > Reply to Steve:
> >
> > Do you mean something like that?
> >
> > import tango.io.Stdout;
> > void func(char[] o_char, ...){
> >  Stdout(o_char, _arguments, _argptr);
> > }
> >
> > public static int
> > main(){
> >  int l_result = 0;
> >  try{
> >    Stdout("smile", 2, 3, 4).newline;
> >    func("smile", 2, 3, 4);
> >  }
> >  catch(Object o){
> >    l_result = 1;
> >    Cout(o.toString);
> >  }
> >  return l_result;
> > }
> >
> > ## result:
> > smile, 2, 3, 4
> > smile, [int, int, int], 12fe58
> 
> It would be nice if something like that was supported, which is what I said 
> in the second paragraph, but what I meant in the first paragraph was 
> something like this (had to dig it up from Tango):
> 
> void realfunc1(TypeInfo[] arguments, ArgList args)
> {
>    // function body here
> }
> 
> void func1(...)
> {
>   realfunc1(_arguments, _argptr);
> }
> 
> void func2(char[] o_char, ...)
> {
>     func1(o_char);
>     realfunc1(_arguments, _argptr);
> }
> 
> Of course, you have to know the realfunc1 function name, or else have to 
> distinguish the parameters somehow.  Tango's tango.text.convert.Layout has a 
> similar strategy.  There's probably a way to use Stdout to call it the way 
> you want.
> 
> -Steve 
> 
> 
Ok it's good idea but "realfunc" is not my own function, it is library function and this can not be modified.

TResult realFunc(TResult)(char[] name, ...)



More information about the Digitalmars-d-learn mailing list