forward variadic arguments
Deewiant
deewiant.doesnotlike.spam at gmail.com
Thu Jun 15 09:35:52 PDT 2006
Frank Benoit wrote:
>> void execSql(char[] aSql, ...) {
>> char[] sql;
>> void putc(dchar c) {
>> sql ~= c;
>> }
>>
>> std.format.doFormat(&putc, _arguments, _argptr);
>>
>> database.exec(sql);
>> }
>
> And what happend to my format string 'aSql' ? :)
>
> TypeInfo[] ti;
> ti ~= aSql.typeinfo;
> ti ~= _arguments
>
> void* p = ????;
> std.format.doFormat(&putc, ti, p);
Oh, whoops! :-)
I guess you could try a hack like that. I think you'll have to use std.stdarg -
somehow; I've never done this myself - to collect the arguments themselves into
an array and then pass the address of the first element of that array as the
equivalent of _argptr. BTW, "aSql.typeinfo" is deprecated: use
"typeid(typeof(aSql))" or just "typeid(char[])" if you're confident you'll never
change its type.
Personally, I'd just change the function signature to "void execSql(...)". It
gives a bit more versatility, the following are equivalent:
execSql("%d hello %d", a, b);
execSql(a, " hello ", b);
execSql("%d hello ", a, b);
If you really want to force the first parameter to be char[], I think the only
way to be sure (apart from that hackish approach, of course :-P) is to assert it
at runtime:
void execSql(...)
in {
assert (_arguments[0] == typeid(char[]));
} body {
// the code
}
More information about the Digitalmars-d-learn
mailing list