On 3 October 2016 at 23:48, Manu <turkey...@gmail.com> wrote: > On 3 October 2016 at 23:41, Manu <turkey...@gmail.com> wrote: >> I'm finding this rather annoying: >> >> struct S >> { >> static @property int p() { return 10; } >> } >> >> pragma(msg, typeof(&S.p)); // prints: int function() @property >> pragma(msg, is(typeof(&S.p) == function)); // prints: false >> >> It looks like a function... but I can't identify it as a function! > > I guess that should read: is(typeof(&S.p) == R function(A), R, A...)) ??
Here's a leg-up: template isStaticMember(T, string member) { mixin("alias M = T." ~ member ~ ";"); static if(__traits(compiles, &M)) { static if(!is(typeof(M) == function)) { static if(is(typeof(&M) == R function(A), R, A...)) { import std.traits : functionAttributes, FunctionAttribute; enum isStaticMember = (functionAttributes!M & FunctionAttribute.property) && /* distinguish static/non-static @property somehow */ */; } else enum isStaticMember = true; } else { enum isStaticMember = __traits(isStaticFunction, M); } } else enum isStaticMember = false; }