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
----