On Monday, 3 October 2016 at 13:19:19 UTC, Manu 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...

template isStaticMember(T, string member)
{
    mixin(`alias mem = T.` ~ member ~ `;`);
    import std.traits : FunctionTypeOf;
static if (is(FunctionTypeOf!mem == function) && is(FunctionTypeOf!(typeof(&mem)) == function)) enum bool isStaticMember = __traits(isStaticFunction, mem);
    else
        enum bool isStaticMember = is(typeof(&mem));
}

Basically, using FunctionTypeOf catches @property functions (which just typeof wouldn't), but it also catches member variables with function types, so we need the second FunctionTypeOf to see if it's still a function when you take its address (true for member functions, including @property functions, not true for member variables with function types).

Everything else is just "can you take the address of this".

Reply via email to