How to unpack a tuple into multiple variables?
    Menjanahary R. R. 
    megnany at afaky.com
       
    Thu Feb  8 06:09:29 UTC 2024
    
    
  
On Wednesday, 7 February 2024 at 05:03:09 UTC, Gary Chike wrote:
> ... But overall it's an elegant way to indirectly add names to 
> tuples in D for ergonomic access. Nice find!
>
> ---
Refactored it a bit to have a ready to run and easy to grasp code.
Enjoy!
```d
import std.stdio : writefln;
import std.typecons: tuple;
     // Name a Tuple's fields post hoc by copying the original's 
fields into a new Tuple.
     template named(names...) {
         auto named(T)(ref auto T t) if (names.length <= 
T.Types.length) =>
             tuple!names(t.expand[0..names.length]);
     }
     // Define variables corresponding to a Tuple's fields in the 
current scope,
     // whose identifiers are given by `names`.
     mixin template Unpack(alias t, names...)
     if (names.length <= t.Types.length) {
         static foreach (i, n; names)
             mixin("auto ", n, " = t[i];");
     }
     void main()
     {
     	auto getUser() => tuple("John Doe", 32);
         //
         auto u = getUser().named!("name", "age");
         writefln("%s (%d)", u.name, u.age); // John Doe (32)
         // You could also do this.
         with (getUser().named!("name", "age"))
             writefln("%s (%d)", name, age); // John Doe (32)
         //
         mixin Unpack!(u, "name", "age");
         writefln("%s (%d)", name, age); // John Doe (32)
     }
```
    
    
More information about the Digitalmars-d-learn
mailing list