On Sunday, 1 July 2018 at 11:19:50 UTC, vino.B wrote:
On Sunday, 1 July 2018 at 09:55:34 UTC, Timoses wrote:>
Hi Timoses,

Thank you very much, can you help me on how to rewrite the below using Variadic template

Passing function as a parameter to another function:

void ptFun(T)(T function(string, string, int) coRoutine, Array!string Dirlst, ) { alias scRType = typeof(coRoutine(string.init, string.init, int.init));

where the "function(string, string, int) coRoutine" should be a variadic function

What's your use case?

You can pretty much pass anything to a template and use "static if" and "static foreach" in the template to steer how the template is instantiated.

    void func(T ...)(T args)
    {
        foreach (i, arg; args)
        {
            static if (isSomeFunction!(T[i]))
            {
                arg();
            }
            else
                writeln(arg);
        }
    }

    unittest
    {
func(() => writeln("I'm a lambda function), "I'm a string", 3);
    }

which would print:

I'm a lambda function
I'm a string
3


I'm actually a bit suprised that `isSomeFunction!(T[i])` works here, I'd expect an error because `i` looks like a run-time variable... And using that in a compile-time (static if) statement usually throws a CT error.


With templates one has to think "compile-time". Any "static if", "static foreach" or alias declarations are compile time constructs. What results from that after compilation is an instantiated template for a specific use case. For example in above case the template exists (is instantiated) with the template parameters `(void function() @safe, string, int)`.

A good source to get some more insights is always:
http://ddili.org/ders/d.en/templates.html
(including all other sections of the book)

Reply via email to