Michel Fortin napisał:

> We already argument this over and over in the past. First, I totally 
> acknowledge that C++ style containers have a problem: they make it 
> easier to copy the content than pass it by reference. On the other side 
> of the spectrum, I think that class semantics makes it too easy to have 
> null dereferences, it's easy to get lost when you have a container of 
> containers.
> 
> I have some experience with containers having class-style semantics: in 
> Objective-C, I ended up creating a set of macro-like functions which I 
> use to initialize containers whenever I use them in case they are null. 
> And I had to do more of these utility functions to handle a particular 
> data structure of mine which is a dictionary of arrays of objects. In 
> C++, I'd have declared this as a "map< string, vector< Object > >" and 
> be done with it; no need for special care initializing each vector, so 
> much easier than in Objective-C.
> 
> I agree that defining structs to have reference semantics as you have 
> done is complicated. But I like the lazy initialization, and we have a 
> precedent for that with AAs (ideally, AAs would be a compatible 
> container too). Can't we just use the GC instead of reference counting? 
> I'd make things much easier. Here is a implementation:
> 
>       struct Container
>       {
>               struct Impl { ... }
> 
>               private Impl* _impl;
>               ref Impl impl() @property
>               {
>                       if (!impl) impl = new Impl;
>                       return *impl;
>               }
>       
>               alias impl this;
>       }
> 
> I also believe reference semantics are not to be used everywhere, even 
> though they're good most of the time. I'd like to have a way to bypass 
> it and get a value-semantic container. With the above, it's easy as 
> long as you keep Container.Impl public:
> 
>       void main() {
>               Container      lazyHeapAllocatedContainer;
>               Container.Impl stackAllocatedContainer;
>       }
> 
>       void MyObject {
>               Container.Impl listOfObjects;
>       }

Is there anything implementation specific in the outer struct that provides ref 
semantics to Impl? If not, Container could be generic, parametrized by Impl 
type.

Overall, I think a value-like implementation in a referency wrapper is a 
clear-cut idiom, bringing order to otherwise messy struct-implemented 
ref-semantics. Do you know of a existing collection library that exploits this 
idea?

-- 
Tomek

Reply via email to