Unpack Variadic Args?

Jeff jeff.monkey.wrench.thirtytwo at gmail.com
Thu Feb 13 16:29:31 UTC 2020


On Thursday, 13 February 2020 at 08:06:52 UTC, Paul Backus wrote:
> On Thursday, 13 February 2020 at 07:06:49 UTC, Jeff wrote:
>> Hello,
>>
>> Was wondering if there was a simple, efficient way to unpack a 
>> variadic template argument. It needs to be efficient at 
>> runtime, and hopefully not use too much excessive CTFE.
>>
>> C++ has the "..." operator, is there something equivalent in D?
>>
>>     template<class ...Args>
>>     void g(Args... args) {
>>         f(foo(args)...); // f(foo(args[0]), foo(args[1])); // 
>> etc
>>     }
>>
>> What would be a good way to write that in D, with it being as 
>> efficient (no copies or building structs etc) and not use too 
>> much CTFE. Needing to use `.map` or similar at CTFE would be 
>> an example of too much CTFE.
>>
>>     void g(Args...)(auto ref Args args) {
>>          // ?
>>     }
>
> Variadic template arguments unpack automatically in D, so you 
> don't need to do anything special here:
>
>     void g(Args...)(auto ref Args args) {
>         import core.lifetime: forward; // like std::forward
>         f(forward!args);
>     }
>
> You can read more about variadic template arguments in this 
> article:
>
> https://dlang.org/articles/ctarguments.html

That would result in the call:

     f( args[0], args[1], ... );

But the C++ version does the following:

     f( foo(args[0]), foo(args[1]), ... );

They are different.


More information about the Digitalmars-d-learn mailing list