On Monday, October 03, 2016 23:19:19 Manu via Digitalmars-d wrote: > Fill in the blank... > I'm having a really hard time with this. I've made it work with a > mountain of code, and I want to see what others come up with...
It's certainly possible that this misses something, but it passes all of your test cases: template isStaticMember(T, string member) { static if(!__traits(hasMember, T, member)) enum bool isStaticMember = false; else { import std.meta : AliasSeq; import std.traits : FunctionTypeOf; alias sym = AliasSeq!(__traits(getMember, T, member))[0]; static if(__traits(isStaticFunction, sym)) enum bool isStaticMember = true; else static if(is(FunctionTypeOf!sym == function) && is(FunctionTypeOf!(typeof(&sym)) == function)) { enum bool isStaticMember = false; } else { enum bool isStaticMember = !__traits(compiles, sym.offsetof) && !is(sym == enum) && !is(sym == class) && !is(sym == struct) && __traits(compiles, &sym); } } } - Jonathan M Davis