D言語での可変長引数は非常に昔ながらの方式、void*のポインタを引き回すことで実現されている。stdarg.dを見ると
typedef void* va_list;
template va_start(T) {
void va_start(out va_list ap, inout T parmn) {
ap = cast(va_list)(cast(void*)&parmn +
((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1)));
}
}
template va_arg(T) {
T va_arg(inout va_list ap) {
T arg = *cast(T*)ap;
ap = cast(va_list)(cast(void*)ap +
((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1)));
return arg;
}
}
となっていて、C/C++のstdargとほぼ同じ。融通は利くけど、あんまり美しくないよね。C#やJavaみたいな、まっとうな配列に落とし込まれる可変長引数は導入されないのかな。