Thread overview
Variadic function template with one inferred template argument
Nov 07, 2020
Ben Jones
Nov 07, 2020
starcanopy
Nov 07, 2020
Ben Jones
November 07, 2020
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.
November 07, 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
November 07, 2020
On Saturday, 7 November 2020 at 21:04:19 UTC, starcanopy wrote:
> void main() {
>     f!(int, float, char)("Hello, world!");
> }
>
> https://run.dlang.io/is/e8FGrF

Ah, I had discovered a different error when I tried that.  Thanks!