Objective-D, reflective programming, dynamic typing

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Apr 4 11:52:09 PDT 2009

grauzone wrote:
> 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);

Yah, in fact this compiles and runs:

import std.variant;
import std.stdio;

void foo(Variant[] x...) {

void main()
     auto t = variantArray(1,2,3);

> Possible output 1:
> [1, 2, 3]
> Possible output 2:
> [[1, 2, 3]]

The former is correct.

> 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.)

The advantage of Variant is a tad subtle. Variant is part of the 
standard library and as such it's trusted code. Although it internally 
uses unsafe features, it offers a safe interface. In contrast, void* 
essentially trusts the application programmer.


More information about the Digitalmars-d mailing list