How to write a singleton template?

Bruno Medeiros daiphoenixNO at SPAMlycos.com
Mon Mar 20 05:52:10 PST 2006


Kyle Furlong wrote:
> Bruno Medeiros wrote:
>> Kyle Furlong wrote:
>>> Bruno Medeiros wrote:
>>>> Kyle Furlong wrote:
>>>>>
>>>>> You might want to consider a mixin:
>>>>>
>>>>> template Singleton(T)
>>>>> {
>>>>>     static this()
>>>>>     {
>>>>>         _instance = new T();
>>>>>     }
>>>>>     public static T instance ()
>>>>>     {
>>>>>         return _instance;
>>>>>     }
>>>>>     private static T _instance;
>>>>> }
>>>>>
>>>>> class OnlyOne
>>>>> {
>>>>>     // Can't include this in the mixin,
>>>>>     // because D can only mixin static things to classes
>>>>>     private this() {}
>>>>>     mixin Singleton!(OnlyOne);
>>>>> }
>>>>>
>>>>
>>>> "because D can only mixin static things to classes"
>>>> -> That is incorrect, you can include instance methods and 
>>>> constructors just fine. See for yourself in a example such as this:
>>>>
>>>>   template Baz() {
>>>>     public void func() { writefln(x); }
>>>>     public this() { writefln("Construct!"); }
>>>>   }
>>>>
>>>>   class Foo {
>>>>     int x = 2;
>>>>     mixin Baz!();
>>>>   }
>>>> ...
>>>>   (new Foo).func();
>>>>
>>>>
>>>> The only problem is with private protection attributes and 
>>>> constructors, as reported in bug:
>>>> news://news.digitalmars.com:119/bug-49-3@http.d.puremagic.com/bugzilla/
>>>>
>>>>
>>>
>>> The documentation leads one to believe that this is impossible. Look 
>>> under the limitations header. This needs to be clarified.
>>
>> The limitations section is about instantiating templates that are 
>> defined inside a class, it is not about mixing in in a template inside 
>> a class, which is a different thing. The limitation exists only in the 
>> first case. This behaviour make sense.
>>
> 
> It is misleading because it asserts "Templates cannot be used to add 
> non-static members or functions to classes." Even with the example, its 
> still a blanket, general statement. It should specify that the example 
> is the only case which has the limitation.

The term, "Inner templates" should be clear enough then, as in "Inner 
Templates cannot be used to add non-static members or functions to 
classes." ?

-- 
Bruno Medeiros - CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list