Andrei Alexandrescu wrote:
grauzone wrote:
Andrei Alexandrescu wrote:
Georg Wrede wrote:
Andrei Alexandrescu wrote:
void foo_templated(T...)(T args)
{
Variant[args.length] dynatyped;
foreach (i, arg; args) dynatyped[i] = arg;
return foo(dynatyped);
}
void foo(Variant[] dynatyped...)
{
...
}
Hmm. An idiom. My sweet tooth just got thirsty for syntactic sugar!
When opImplicitCastFrom will be implemented, foo's definition will be
enough. You'll write foo(1, 2.3, "a") and the compiler will rewrite
it to foo(Variant(1), Variant(2.3), Variant("a")).
This looks very good. How exactly will it work?
Variant will implement opImplicitCastFrom(T) for all types T. The "..."
in foo's declaration already allows variadic arguments. The rest will be
taken care of by the compiler.
I see.
Consider if opImplicitCastFrom was implemented and you had a function
"void foo(Variant[] x...)", would it be possible to pass a Variant[] to
it, that will be directly used as "x"?
For example:
void foo(Variant[] x...) {
writefln(x);
}
Variant[] t = [1,2,3];
foo(t);
Possible output 1:
[1, 2, 3]
Possible output 2:
[[1, 2, 3]]
This is a slight ambiguity. Will "t" be packed into a Variant, or will
it directly assign "t" to "x" as if there wasn't an
opImplicitCastFrom(T)? Would it be a compilation error?
Anyway. If this would work, chaining function calls would be simple, and
wouldn't require additional wrapper functions.
So IMHO:
(a) Variadics with templates are good;
The "void foo(Variant[] dynatyped...)" isn't a template. But if on the
caller side you can use it as if it was a "void foo(T)(T...)" or a "void
foo(...)", everything is fine.
(b) Variadics with uniform-type arrays are good;
Sure.
(c) We should avoid variadics with void*.
Well, it isn't really important whether you use a (TypeInfo, void*)
tuple, or a Variant for passing around data of a dynamic type unknown at
compile time. Of course, Variant is much nicer.
I was only suggesting void*, because for classic variadics, it's
probably simpler to implement on the compiler side. (Although, as you
said, it's hard to convert a (TypeInfo, void*) to Variant.)
Andrei