March 20, 2006
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.
March 20, 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
1 2
Next ›   Last »