Andrei Alexandrescu wrote:
Jarrett Billingsley wrote:
On Fri, Apr 3, 2009 at 11:20 AM, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:

You can't.  D's varargs suck.
Of course you can. Where did that come from?

void foo(T...)(T args) { bar(args); }
void bar(T...)(T args) {  foreach (a; args) writeln(a); }

*NOT* the same thing.  They are templated, which means a new
instantiation for each different combination of argument types, and
cannot be virtual.  Please keep that in mind.

But my point was that variadic templates can be ideal wrappers for the non-templated variadics, which can be virtual. It's the best of both worlds, you get no bloating and comfortable calling syntax too.

I think it's silly to ask "I want to do... xyz... but without templates because templates aren't virtual/cause bloating/bring up painful memories". Templates are an excellent starting point in many designs because they preserve full typing of the parameters. Then, of course you can route them to dynamic functions no problem.

Okay, so before I had to write:

void foo(...)
{
   foo(_argptr, _arguments);
}
void foo(void* argptr, TypeInfo[] argtypes) {}


You want me to instead write:

// needs a different name due to overload issues
void foo_templated(T...)(T args)
{
   foo(args);
}
void foo(...)
{
   foo(_argptr, _arguments);
}
void foo(void* argptr, TypeInfo[] argtypes) {}

How the hell does that help?

Reply via email to