How to send variadic arguments
Sivo Schilling
sivo.schilling at web.de
Tue Aug 26 00:29:05 PDT 2008
You can do this stuff using a template function.
Example:
---
// forward variadic function arguments to builtin library functions
module fwvargs;
import std.stdio;
void vafunc(T...)(in char[] fmt, T args)
{
writefln(fmt, args);
}
void main()
{
vafunc("Called vafunc with argument %f", 2608.2008);
}
---
Output:
$>Called vafunc with argument 2608.200800
Regards.
Zarathustra Wrote:
> 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