D's metaprogramming could be flawed

maik klein via Digitalmars-d digitalmars-d at puremagic.com
Sat Jan 23 04:13:16 PST 2016


On Friday, 22 January 2016 at 14:19:30 UTC, rsw0x wrote:
> On Friday, 22 January 2016 at 13:28:00 UTC, maik klein wrote:
>> On Friday, 22 January 2016 at 13:21:11 UTC, rsw0x wrote:
>>> On Friday, 22 January 2016 at 12:57:54 UTC, maik klein wrote:
>>>> ...
>>>
>>> You're looking for AliasSeq in std.meta, it's a tup—er, 
>>> finite ordered list of types :)
>>
>> I am already aware of AliasSeq as I have written above. But I 
>> could have misused it, would you mind showing an example with 
>> TupleRef?
>
> Sorry, I must have skipped that.
>
> Is there a reason you're explicitly using tuples?
> Unless I'm misunderstanding you, you're looking for something 
> like...
>
> struct Baz(V...) {
>   V vals;
> }
>
> which can be used like...
>
> void foo(int, int, int) {
>
> }
>
> void main(){
>   auto i = Baz!(int, int, int)();
>   foo(i.vals);
> }
>
> or am I way off base?
>
> If so, is this similar to what you're looking for?
> http://dpaste.dzfl.pl/cbae4c4ed7af
>
> Sorry if I'm nowhere near what you meant.

I think that should work but it only works because you do an 
implicit conversion with get which is quite nice.

But I was also looking for a more general solution.

I think the mixin solution could be quite nice.

static template unpack(alias f){
   pragma(inline)
   auto into(alias target, Args...)(ref Args args){
     import std.conv;
     enum s = 
`target(`~iota(Args.length).map!(i=>text(`f(args[`,i,`])`)).join(",")~`)`;
     return mixin(s);
   }
}

and use it like:

auto r = unpack!(i => i * 2).into!((a, b) => a + b)(1,2);


The only semi weird thing is that I can use this directly with my 
version of TupleRef like this:

void foo(ref int, ref int){
}

unpack!((r)=> r.get()).into!(foo)(tref.refTs.expand);


I think that is because "lambda/delegates" can not express ref 
return types?

So I think I need to do this:

ref auto get(R)(R r){
   return r.get();
}

unpack!(get).into!(foo)(tref.refTs.expand);



More information about the Digitalmars-d mailing list