static __gshared struct

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jul 1 20:20:30 PDT 2016


On Saturday, 2 July 2016 at 00:08:10 UTC, Hiemlick Hiemlicker 
wrote:
> On Friday, 1 July 2016 at 23:36:35 UTC, Basile B. wrote:
>> On Friday, 1 July 2016 at 23:26:19 UTC, Hiemlick Hiemlicker 
>> wrote:
>>> On Friday, 1 July 2016 at 23:03:17 UTC, Basile B. wrote:
>>>> [...]
>>> Ok, Does that mean
>>>
>>>
>>>>     [...]
>>>       foo();
>>>> [...]
>>>
>>> void foo()
>>> {
>>>    Foo f;
>>> }
>>>
>>> works?
>>
>> No.
>>
>> An example usage is for the singleton pattern:
>>
>>     T singletonViaFactory(T, A...)(A a)
>>     if (is(T == class))
>>     {
>>         static T instance;
>>         if (instance)
>>             return instance;
>>         else
>>             return new T(a);
>>     }
>>
>> "instance" is well a global variable and not a local, but it's 
>> hidden from the outside world.
>>
>>> Also, then how do I declare a struct to be "global" so that 
>>> it can be common to all threads? Do I have to declare 
>>> _gshared for each element of the struct?
>>
>> no, just put __gshared before the variable declaration, not 
>> for each member:
>>
>>     struct Foo
>>     {
>>         int i;
>>     }
>>
>>     __gshared Foo foo;
>>
>> is fine.
>
> I use a struct with static members so I do not have to 
> instantiate it. It is essentially a singleton. I want all the 
> variables to be __gshared. I guess I have to prefix all 
> variables with it?
>
> Basically I have Foo.i; on foo. i is static, of course. I also 
> want it to be __gshared.
>
> Makes sense to me that
>
> __gshared struct x;
>
> all of x's variables should be __gshared.

__gshared is a storage modifier only NOT a type modifier. As 
opposed to immutable which is both, i.e. one can mark a class 
immutable and then only create immutable classes.

if you want to be able to use members without a declaration. then 
you must use

struct Foo
{
     static int i;
}

void main()
{
     Foo.i = 42;
}


More information about the Digitalmars-d-learn mailing list