How to get the UDAs for a function parameter correctly?
Heromyth
bitworld at qq.com
Mon May 11 03:21:32 UTC 2020
On Monday, 11 May 2020 at 02:34:32 UTC, Adam D. Ruppe wrote:
> On Monday, 11 May 2020 at 02:25:39 UTC, Heromyth wrote:
>> I want to get the UDAs for for a function parameter. Here the
>> test code and I got some errors:
>
> I think my blog aside is one of the few if only write-ups on
> how to do this:
>
> http://dpldocs.info/this-week-in-d/Blog.Posted_2019_02_11.html#how-to-get-uda-on-a-function-param
>
>
> the library will not help much, you need to slice the
> parameters yourself. (It might work combine lib stuff with
> slice though, e.g. getUDA!(Parameters!F[1 .. 2]) maybe, i have
> never tried).
>
> but this does work:
>
> static if(is(typeof(method) P == __parameters))
> foreach(idx, _; P) {{
> // alias for convenience later
> alias param = P[idx .. idx + 1]; // this slice
> is the trick
> // can get the identifier now
> string ident = __traits(identifier, param);
> // and the attributes
> foreach(attr; __traits(getAttributes, param))
> {}
> }}
That's great! It should use
static if(is(typeof(method) P == __parameters))
to get all the parameters instead of using:
alias Params = Parameters!(member);
Here is the adjusted code:
=================================
import std.stdio;
import std.traits;
import std.meta;
struct Length {
int a;
int b;
}
class ClassA {
void test(@Length(1, 9) int len, @Length(2, 4) int size) {
writeln("It's OK");
}
void test(string name, @Length(3, 5) int len) {
writeln("Works now");
}
void test() {
}
}
string test(T)() {
string str;
alias currentMembers = __traits(getOverloads, T, "test");
static foreach(member; currentMembers) {{
static if(is(typeof(member) Params == __parameters)) {
static foreach(i, _; Params)
{{
alias ThisParameter = Params[i .. i + 1];
static foreach(uda; __traits(getAttributes,
ThisParameter)) {
str ~= uda.stringof ~ "\n";
}
}}
}
}}
return str;
}
void main() {
enum aa = test!(ClassA);
writeln(aa);
}
More information about the Digitalmars-d-learn
mailing list