How do you test whether a variable is static or not?

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jul 30 06:07:53 PDT 2016


On Saturday, 30 July 2016 at 12:47:10 UTC, Jonathan M Davis wrote:
> I'm writing some serialization code where I need to skip static 
> variables. So, I have a symbol from a struct, and I'd like to 
> test whether it's static or not. Ideally, I'd be able to do 
> something like
>
> is(field == static)
>
> but of course that doesn't work. There is 
> __traits(isStaticFunction, ...),
> but there is no __traits(isStaticVariable, ...) or 
> __traits(isStatic, ...),
> and I don't see anything in std.traits which would help. The 
> closest that
> I've been able to come up with is
>
> template isStaticVar(T, alias field)
> {
>     enum isStaticVar =
>         is(typeof({mixin("auto i = T." ~ field.stringof ~ 
> ";");}));
> }
>
> For a more general solution, it would of course need to verify 
> that the field wasn't a function as well, but in my case, that 
> was already checked prior to instantiating isStaticVar, so I 
> can skip it here. And what I have mostly works. However, it 
> would fail miserably if the field were a static member variable 
> that was non-copyable. If it were, then that code would would 
> declare it to be non-static. Now, non-copyable structs are rare 
> enough that I can probably get away with letting that bug 
> stand, but I'd prefer to correctly detect whether a variable is 
> static or not. Does anyone have a better idea of how to do this?
>
> - Jonathan M Davis

You won't be able to assign it if it's not static. Given this


     isStaticVar(Stuff) = __traits(compiles, Stuff = 
typeof(Stuff).init))

Unfortuantely it's hard to make a stand alone template for this. 
For example I was not able to verify the non-static case


struct Foo
{
     static int a;
     int b;
}

template isStaticVar(alias stuff)
{
     bool check()
     {
         bool result;
         static if (!is(typeof(__traits(parent, stuff))))
             result = true;
         else static if (__traits(compiles, stuff = 
typeof(stuff).init))
             result = true;
         return result;
     }
     enum isStaticVar = check();
}

unittest
{
     static assert(isStaticVar!(Foo.a));
     //static assert(isStaticVar!(Foo.b));
}

I'm curious to see the other solutions.


More information about the Digitalmars-d-learn mailing list