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...
If you succeed, put it in std.traits! Recommend, use latest DMD nightly. I find differences with latest nightly vs release. ------------------------------------------------------------------------------- template isStaticMember(T, string member) { enum bool isStaticMember = [code goes here]; } struct S { enum X = 10; enum Y { i = 10 } struct S {} class C {} static int x = 0; __gshared int y = 0; static void f() {} static void f2() pure nothrow @nogc @safe {} shared void g() {} static void function() fp; __gshared void function() gfp; void function() fpm; void m() {} final void m2() const pure nothrow @nogc @safe {} inout(int) iom() inout { return 10; } static inout(int) iosf(inout int x) { return x; } @property int p() { return 10; } static @property int sp() { return 10; } } class C { enum X = 10; enum Y { i = 10 } struct S {} class C {} static int x = 0; __gshared int y = 0; static void f() {} static void f2() pure nothrow @nogc @safe {} shared void g() {} static void function() fp; __gshared void function() gfp; void function() fpm; void m() {} final void m2() const pure nothrow @nogc @safe {} inout(int) iom() inout { return 10; } static inout(int) iosf(inout int x) { return x; } @property int p() { return 10; } static @property int sp() { return 10; } } static assert(!isStaticMember!(S, "X"), "!"); static assert(!isStaticMember!(S, "Y"), "!"); static assert(!isStaticMember!(S, "Y.i"), "!"); static assert(!isStaticMember!(S, "S"), "!"); static assert(!isStaticMember!(S, "C"), "!"); static assert( isStaticMember!(S, "x"), "!"); static assert( isStaticMember!(S, "y"), "!"); static assert( isStaticMember!(S, "f"), "!"); static assert( isStaticMember!(S, "f2"), "!"); static assert(!isStaticMember!(S, "g"), "!"); static assert( isStaticMember!(S, "fp"), "!"); static assert( isStaticMember!(S, "gfp"), "!"); static assert(!isStaticMember!(S, "fpm"), "!"); static assert(!isStaticMember!(S, "m"), "!"); static assert(!isStaticMember!(S, "m2"), "!"); static assert(!isStaticMember!(S, "iom"), "!"); static assert( isStaticMember!(S, "iosm"), "!"); static assert(!isStaticMember!(S, "p"), "!"); static assert( isStaticMember!(S, "sp"), "!"); static assert(!isStaticMember!(C, "X"), "!"); static assert(!isStaticMember!(C, "Y"), "!"); static assert(!isStaticMember!(C, "Y.i"), "!"); static assert(!isStaticMember!(C, "S"), "!"); static assert(!isStaticMember!(C, "C"), "!"); static assert( isStaticMember!(C, "x"), "!"); static assert( isStaticMember!(C, "y"), "!"); static assert( isStaticMember!(C, "f"), "!"); static assert( isStaticMember!(C, "f2"), "!"); static assert(!isStaticMember!(C, "g"), "!"); static assert( isStaticMember!(C, "fp"), "!"); static assert( isStaticMember!(C, "gfp"), "!"); static assert(!isStaticMember!(C, "fpm"), "!"); static assert(!isStaticMember!(C, "m"), "!"); static assert(!isStaticMember!(C, "m2"), "!"); static assert(!isStaticMember!(C, "iom"), "!"); static assert( isStaticMember!(C, "iosm"), "!"); static assert(!isStaticMember!(C, "p"), "!"); static assert( isStaticMember!(C, "sp"), "!");