Skip to content

Commit eb92dc9

Browse files
authored
Merge pull request #5112 from sprinkle131313/is-static-member
Issue 16485 - Add trait for testing if a member is static. merged-on-behalf-of: Jack Stouffer <jack@jackstouffer.com>
2 parents 0b88ae0 + 0c1e96c commit eb92dc9

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Added `std.traits.hasStaticMember` to check whether a symbol is a static member of a type.
2+
3+
-------
4+
import std.traits : hasStaticMember;
5+
6+
struct S
7+
{
8+
static int staticVar;
9+
int nonstaticVar;
10+
}
11+
12+
assert( hasStaticMember!(S, "staticVar"));
13+
assert(!hasStaticMember!(S, "nonstaticVar"));
14+
-------

std/traits.d

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
* $(LREF hasElaborateDestructor)
4545
* $(LREF hasIndirections)
4646
* $(LREF hasMember)
47+
* $(LREF hasStaticMember)
4748
* $(LREF hasNested)
4849
* $(LREF hasUnsharedAliasing)
4950
* $(LREF InterfacesTuple)
@@ -3553,6 +3554,182 @@ enum hasMember(T, string name) = __traits(hasMember, T, name);
35533554
static assert(hasMember!(S, "foo"));
35543555
}
35553556

3557+
/**
3558+
* Whether the symbol represented by the string, member, exists and is a static member of T.
3559+
*
3560+
* Params:
3561+
* T = Type containing symbol $(D member).
3562+
* member = Name of symbol to test that resides in $(D T).
3563+
*
3564+
* Returns:
3565+
* $(D true) iff $(D member) exists and is static.
3566+
*/
3567+
template hasStaticMember(T, string member)
3568+
{
3569+
static if (__traits(hasMember, T, member))
3570+
{
3571+
import std.meta : Alias;
3572+
alias sym = Alias!(__traits(getMember, T, member));
3573+
3574+
static if (__traits(getOverloads, T, member).length == 0)
3575+
enum bool hasStaticMember = __traits(compiles, &sym);
3576+
else
3577+
enum bool hasStaticMember = __traits(isStaticFunction, sym);
3578+
}
3579+
else
3580+
{
3581+
enum bool hasStaticMember = false;
3582+
}
3583+
}
3584+
3585+
///
3586+
@safe unittest
3587+
{
3588+
static struct S
3589+
{
3590+
static void sf() {}
3591+
void f() {}
3592+
3593+
static int si;
3594+
int i;
3595+
}
3596+
3597+
static assert( hasStaticMember!(S, "sf"));
3598+
static assert(!hasStaticMember!(S, "f"));
3599+
3600+
static assert( hasStaticMember!(S, "si"));
3601+
static assert(!hasStaticMember!(S, "i"));
3602+
3603+
static assert(!hasStaticMember!(S, "hello"));
3604+
}
3605+
3606+
@safe unittest
3607+
{
3608+
static struct S
3609+
{
3610+
enum X = 10;
3611+
enum Y
3612+
{
3613+
i = 10
3614+
}
3615+
struct S {}
3616+
class C {}
3617+
3618+
static int sx = 0;
3619+
__gshared int gx = 0;
3620+
3621+
Y y;
3622+
static Y sy;
3623+
3624+
static void f();
3625+
static void f2() pure nothrow @nogc @safe;
3626+
3627+
shared void g();
3628+
3629+
static void function() fp;
3630+
__gshared void function() gfp;
3631+
void function() fpm;
3632+
3633+
void delegate() dm;
3634+
static void delegate() sd;
3635+
3636+
void m();
3637+
final void m2() const pure nothrow @nogc @safe;
3638+
3639+
inout(int) iom() inout;
3640+
static inout(int) iosf(inout int x);
3641+
3642+
@property int p();
3643+
static @property int sp();
3644+
}
3645+
3646+
static class C
3647+
{
3648+
enum X = 10;
3649+
enum Y
3650+
{
3651+
i = 10
3652+
}
3653+
struct S {}
3654+
class C {}
3655+
3656+
static int sx = 0;
3657+
__gshared int gx = 0;
3658+
3659+
Y y;
3660+
static Y sy;
3661+
3662+
static void f();
3663+
static void f2() pure nothrow @nogc @safe;
3664+
3665+
shared void g() { }
3666+
3667+
static void function() fp;
3668+
__gshared void function() gfp;
3669+
void function() fpm;
3670+
3671+
void delegate() dm;
3672+
static void delegate() sd;
3673+
3674+
void m() {}
3675+
final void m2() const pure nothrow @nogc @safe;
3676+
3677+
inout(int) iom() inout { return 10; }
3678+
static inout(int) iosf(inout int x);
3679+
3680+
@property int p() { return 10; }
3681+
static @property int sp();
3682+
}
3683+
3684+
static assert(!hasStaticMember!(S, "X"));
3685+
static assert(!hasStaticMember!(S, "Y"));
3686+
static assert(!hasStaticMember!(S, "Y.i"));
3687+
static assert(!hasStaticMember!(S, "S"));
3688+
static assert(!hasStaticMember!(S, "C"));
3689+
static assert( hasStaticMember!(S, "sx"));
3690+
static assert( hasStaticMember!(S, "gx"));
3691+
static assert(!hasStaticMember!(S, "y"));
3692+
static assert( hasStaticMember!(S, "sy"));
3693+
static assert( hasStaticMember!(S, "f"));
3694+
static assert( hasStaticMember!(S, "f2"));
3695+
static assert(!hasStaticMember!(S, "dm"));
3696+
static assert( hasStaticMember!(S, "sd"));
3697+
static assert(!hasStaticMember!(S, "g"));
3698+
static assert( hasStaticMember!(S, "fp"));
3699+
static assert( hasStaticMember!(S, "gfp"));
3700+
static assert(!hasStaticMember!(S, "fpm"));
3701+
static assert(!hasStaticMember!(S, "m"));
3702+
static assert(!hasStaticMember!(S, "m2"));
3703+
static assert(!hasStaticMember!(S, "iom"));
3704+
static assert( hasStaticMember!(S, "iosf"));
3705+
static assert(!hasStaticMember!(S, "p"));
3706+
static assert( hasStaticMember!(S, "sp"));
3707+
3708+
static assert(!hasStaticMember!(C, "X"));
3709+
static assert(!hasStaticMember!(C, "Y"));
3710+
static assert(!hasStaticMember!(C, "Y.i"));
3711+
static assert(!hasStaticMember!(C, "S"));
3712+
static assert(!hasStaticMember!(C, "C"));
3713+
static assert( hasStaticMember!(C, "sx"));
3714+
static assert( hasStaticMember!(C, "gx"));
3715+
static assert(!hasStaticMember!(C, "y"));
3716+
static assert( hasStaticMember!(C, "sy"));
3717+
static assert( hasStaticMember!(C, "f"));
3718+
static assert( hasStaticMember!(C, "f2"));
3719+
static assert(!hasStaticMember!(S, "dm"));
3720+
static assert( hasStaticMember!(S, "sd"));
3721+
static assert(!hasStaticMember!(C, "g"));
3722+
static assert( hasStaticMember!(C, "fp"));
3723+
static assert( hasStaticMember!(C, "gfp"));
3724+
static assert(!hasStaticMember!(C, "fpm"));
3725+
static assert(!hasStaticMember!(C, "m"));
3726+
static assert(!hasStaticMember!(C, "m2"));
3727+
static assert(!hasStaticMember!(C, "iom"));
3728+
static assert( hasStaticMember!(C, "iosf"));
3729+
static assert(!hasStaticMember!(C, "p"));
3730+
static assert( hasStaticMember!(C, "sp"));
3731+
}
3732+
35563733
/**
35573734
Retrieves the members of an enumerated type $(D enum E).
35583735

0 commit comments

Comments
 (0)