On Tuesday, 21 December 2021 at 08:26:17 UTC, rempas wrote:
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.

You can use switch + static foreach:

```d
import std.stdio;

    //this print args in reverse order:
    void print(T...)(string prompt, T args)
    {
        void print_arg(size_t index){
            switch(index){
                static foreach(i, a; args){
                        case i:
                        // handle your other types
                        write(a);
                        return; 
                }
                default:
                        assert(0, "no impl");
            }
        }

        write(prompt);
        size_t len = args.length;
        while(len --> 0)
            print_arg(len);
    }

    void main(){
        print("Prompt (ignored): ", "Hello", " world!\n", 123);
    }

```

Reply via email to