On 11.06.19 01:12, Johannes Loher wrote:
I would like to iterate over all parameters of a function using static foreach and then process each parameter's UDAs. But by using static foreach on the parameter tuple, slicing it is not possible anymore, so the suggested workaround does not work in this case :(

The workaround is to work with 1-length slices of your parameter sequence instead of elements. You can still do that. You just can't `foreach` over the parameters directly. Instead, iterate with an index and use it to get slices:

-----
import std;

struct Test
{}

void foo(@(1) Test x, @(2) @(3) float y)
{
}

void main()
{
    alias Params = Parameters!foo;
    pragma(msg, Params);
    static foreach(i; 0 .. Params.length)
    {{
        alias P = Params[i .. i + 1];
        pragma(msg, P);
        static foreach(uda; __traits(getAttributes, P))
        {
            pragma(msg, uda);
        }
    }}
}
----

Prints:

----
(@(1) Test, @(tuple(2), tuple(3)) float)
(@(1) Test)
1
(@(tuple(2), tuple(3)) float)
2
3
----

Reply via email to