How to properly use variadic templates (functions)?

rempas rempas at tutanota.com
Tue Dec 21 08:26:17 UTC 2021


On Tuesday, 21 December 2021 at 08:11:39 UTC, Anonymouse wrote:
>
> I'm not certain I understand, but won't `foreach (i, a; args) { 
> /* ... */ }` in his example do that?
>
> As in, if you necessarily must index `args` instead of using a 
> foreach variable,
>
> ```d
> import core.stdc.stdio : putc, stdout;
>
> void print(T...)(string prompt, T args)
> {
>     foreach (i, a; args)
>     {
>         alias A = typeof(args[i]);
>
>         static if (is(A : string))
>         {
>             for (int j = 0; j < args[i].length; j++)
>             {
>                 putc(args[i][j], stdout);
>             }
>         }
>         else
>         {
>             // handle your other types
>             print("", A.stringof);
>         }
>     }
> }
>
> void main()
> {
>     print("Prompt (ignored)", "Hello", " world!\n", 123);
> }
> ```

No it will not. I will try to explain it the best way I can. When 
I say I want to index args, I mean that I want to index and 
choose which argument to use rather than use them continuously 
one after another inside a `foreach`. For example check the 
following call:

`print("Hello %s!%c", "world", '\n');`

In that case I want to first print print from "H" up to (but not 
include) "%s". Then I want to print the first argument. After 
that, I want to print the '!' character and then I want to print 
the second argument. So I need a way to keep track which argument 
was the last one I printed and manually choose which argument to 
use. So `foreach` will not do in that case because I don't want 
to continuously use the arguments one after another. Is is more 
clear now? "writef" exists in phobos so I'm pretty sure that 
there is a way to do that.


More information about the Digitalmars-d-learn mailing list