variadic args
Bill Baxter
dnewsgroup at billbaxter.com
Tue Dec 12 00:00:02 PST 2006
novice2 wrote:
> thanx Bill Baxter.
> but i don't need foreach...
> no need any *processing*
> just repassing to variadic function, not my, for example format
> (...) or writef(...)
>
> please, don't show me how to reimplement format with doFormat(),
> i already to do it. but it is ugly :)
Ok, then for you I'll make the special "lean and mean" version:
struct VArgs
{
static VArgs opCall(TypeInfo[] arguments, va_list argptr)
{
VArgs result;
result.arguments = arguments;
result.argptr = argptr;
return result;
}
TypeInfo[] arguments;
va_list argptr;
}
void vFoo(VArgs args)
{
// do the actual body of the function here
vBar(args);
}
void foo(...)
{
vFoo(VArgs(_arguments, _argptr));
}
void vBar(VArgs args)
{
}
void bar(...)
{
vBar(VArgs(_arguments, _argptr));
}
----
The point is more that _arguments and _argptr belong together, so it
makes sense to package them up into a single struct to pass them around
together rather than always passing them as two separate arguments.
Whether or not you want the struct to help with processing the arguments
is up to you.
Personally I wish that D would a) pass a struct like the above to
variadic functions, and b) let users specify a name rather than giving
access to them through magic parameter names. Magic parameter names
with underscores just look terribly hackish. Instead we could have
something like:
void bar(...args) {
//use args.types[i], *args.argptr here
}
--bb
More information about the Digitalmars-d-learn
mailing list