Are named variadic arguments possible?

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Wed Jan 6 08:13:36 PST 2010


Lars T. Kyllingstad wrote:
> downs wrote:
>> Alex wrote:
>>> Is it possible, using templates, tuples, or some other mechanism, to 
>>> implement named variadic arguments in D?
>>>
>>> For example, I'd like to be able to do something like...
>>> foo( 2, &bar, age : 10, status : "down");
>>>
>>> and so forth.
>>
>> Yes, with a small hack.
>>
>> typedef int age_type;
>>
>> age_type age(int i) { return cast(age_type) i; }
>>
>> void foo(T...)(int i, Bar*, T t) {
>>   // Test T for age_type here.
>> }
> 
> 
> In D2 this won't be possible for much longer, since typedef is going 
> away. But you can fake it:
> 
>   template Typedef(T, string name)
>   {
>       mixin("struct "~name~" { "~T.stringof~" x; alias x this; }");
>   }
> 
>   mixin Typedef!(int, "age_type");
>   age_type age(int i) { return age_type(i); }
> 
> If you're going to use it a lot, you can even automate it further:
> 
>   template NamedArg(T, string name)
>   {
>       mixin Typedef!(T, name~"_type");
>       mixin(name~"_type "~name~"("~T.stringof~" t) {"
>     ~" return "~name~"_type(t); }");
>   }
> 
>   mixin NamedArg!(int, "age");
>   mixin NamedArg!(string, "status");
> 
>   foo(2, &bar, age(10), status("down"));

Forget that last part. I just realised you don't need the helper 
functions.. :)

   mixin Typedef!(int, "age");
   mixin Typedef!(int, "status");

   foo(2, &bar, age(10), status(down)); // should work

-Lars


More information about the Digitalmars-d-learn mailing list