Variadic templates

Reiner Pope reiner.pope at REMOVE.THIS.gmail.com
Thu Nov 2 23:15:25 PST 2006


Craig Black wrote:
> This feature seems to supercede older versions of variadic functions.  Are 
> there still reasons to use the older approach to variadics?  If not, should 
> any of the older approaches ever be deprecated in order to simplify the D 
> language?
> 
> -Craig 
> 
> 
I think that we can get rid of old varargs, and here's why:

The only feature-wise differences I can see between old varargs and new 
variadic templates is that old varargs can be done without the 
source-code present, and old varargs can be a virtual function of a class.

We can address both of these concerns with wrapper functions and an 
additional Phobos library:

// This would be part of Phobos
struct varargData
{
   TypeInfo[] ti;
   void* argptr;
}

varargData getVarargData(T...) (T t)
{
   varargData info;
   with (info)
     foreach (t; a)
     {
       ti ~= typeid(t);
       argptr ~= cast(void*)t[0..t.sizeof]; // I'm not sure if this is 
right, but you get the idea
     }
   return info;
}

// This would be the wrapper function of the closed-source library.
// The wrapper is open source, but doesn't expose any algorithmic details.
// This is analogous to C++ header files.
void opensourceWrapper(T...) (T t)
{
   auto data = getVarargData(t);
   closedFoo(data);
}

// We could create a 'final' wrapper function within a class:
class Foo
{
   final void foo(T...) (T t)
   {
      auto data = getVarargData(t);
      virtualFoo(data);
   }

   // Subclasses override this
   void virtualFoo(varargData data) {...}
}

So, the same functionality as old varargs can be achieved with new 
varargs, with a small pattern on the declaration site. I assert that the 
need for this pattern will be sufficiently small (since vararg functions 
are quite rare, and they are generally better to implement with 
templates anyway) that this syntactic sugar (old varargs) can be removed 
from the language.

Furthermore, this pattern is simple enough that it should be possible to 
express with a sufficiently powerful macro system. Unfortunately, the 
lack of string pasting in macros means that making differently-named 
wrappers is not possible at the moment.

Cheers,

Reiner



More information about the Digitalmars-d mailing list