Variadic function template with one inferred template argument

starcanopy starcanopy at protonmail.com
Sat Nov 7 21:04:19 UTC 2020


On Saturday, 7 November 2020 at 20:43:04 UTC, Ben Jones wrote:
> I'm trying to write a function template with 1 parameter whose 
> type is inferred, but with the other parameters variadic.
>
> Basically, I want to do this:
>
> auto f(Ts..., Inferred)(Inferred inf){}
>
> and call it with f!(X,Y,Z)(w) //inferred will be typeof(w), 
> Ts... == (X, Y, Z)
>
> which I can't do because the variadic template args have to 
> come last.
>
> Is there a way to change f so that the caller can use it like I 
> want?  I tried this approach which didn't work.
>
> template f(Ts...){
>   auto f(Inferred)(Inferred inf){}
> }
>
> I don't see a way to specify a variadic set of template args 
> but have one inferred.  I could wrap the variadic args in 
> another template so f just takes 2 params, but I'd like to 
> avoid that because it makes the calling code more complicated.

template f(Ts...) {
     auto f(Inferred)(Inferred inf) {
         pragma(msg, Ts);
         import std.stdio : writeln;
         inf.writeln;
     }
}

void main() {
     f!(int, float, char)("Hello, world!");
}

https://run.dlang.io/is/e8FGrF


More information about the Digitalmars-d-learn mailing list