www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Typesafe variadic functions

reply "Vathix" <vathixSpamFix dprogramming.com> writes:
How would you determine if an argument is of any object type? I think you
have to either test for all the object types, or require the caller to cast
them all to Object and just test for that. Would it be possible to make it
simpler?


There should be a way to use in/out/inout. I have some ideas:

1) Allow the caller to specify in/out/inout for parameters like:
   void foo(...);
   int var;
   foo(out var);
This would also be nice for self documenting your code, even for regular
functions:
   void bar(out int);
   int var;
   bar(out var);
It wouldn't have to be required; but if it's specified, it must match.

2) Allow in/out/inout to be used with ... like:
   void scan(out ...);
   int var;
   scan(var); // var is out.
Probably a lot easier to implement, but is less versatile.

3) Just use pointers instead ...


The documentation says that the type of _arguments is typeinfo[] but it's
actually TypeInfo[]. It also says that _argptr is void* but it might confuse
people using std.c.stdarg which expects type va_list (I know they're the
same type under the alias).
Jun 23 2004
parent "Walter" <newshound digitalmars.com> writes:
"Vathix" <vathixSpamFix dprogramming.com> wrote in message
news:cbcfjd$stg$1 digitaldaemon.com...
 How would you determine if an argument is of any object type?

if (cast(TypeInfoClass)typeid(arg)) ...
 There should be a way to use in/out/inout. I have some ideas:

 1) Allow the caller to specify in/out/inout for parameters like:
    void foo(...);
    int var;
    foo(out var);
 This would also be nice for self documenting your code, even for regular
 functions:
    void bar(out int);
    int var;
    bar(out var);
 It wouldn't have to be required; but if it's specified, it must match.

 2) Allow in/out/inout to be used with ... like:
    void scan(out ...);
    int var;
    scan(var); // var is out.
 Probably a lot easier to implement, but is less versatile.

 3) Just use pointers instead ...

I'll go with (3). Variadic functions are rare, so I don't think they need as much support.
 The documentation says that the type of _arguments is typeinfo[] but it's
 actually TypeInfo[].

Fixed, thanks.
 It also says that _argptr is void* but it might confuse
 people using std.c.stdarg which expects type va_list (I know they're the
 same type under the alias).

std.c.stdarg is obsolete, should use std.stdarg instead now.
Jun 23 2004