On Fri, 04 May 2012 11:21:06 -0400, Jakob Ovrum <jakobov...@gmail.com> wrote:

On Friday, 4 May 2012 at 13:22:47 UTC, Steven Schveighoffer wrote:
Structs don't make very good containers. A slice is not really a container.

Most containers in std.container are structs. A struct can do everything a class can do, for example, you can choose whether to use reference semantics or not. So I don't think the assertion that structs aren't good for containers is true, when they can do so much more than classes. There is still debate whether std.container's containers should be classes or structs, but even so, third-party containers might have different requirements.

Non-reference semantics for containers are very bad. Look at std::vector and how much inefficient code exists that passes it by value.

A container has one important property with regard to its elements, it *owns* the elements. This screams reference semantics, because if you use value semantics, you need to *copy all the elements*.

Yes, a struct can do reference semantics, but it makes little sense to fight the type system and shoehorn it into reference semantics, when classes are reference types by default.

It would obviously be a dead simple function, the question is whether it's generally useful enough for the standard library, which I personally don't see it being, at least not until I see at least one good example.

I think the use case is, instead of defining some transformation function X as a member of a container, you:

1. define X as a function that accepts a range and returns a range
2. define a way to obtain a range of all elements from a container
3. define a way to construct a new container from a range.

Then you only have to define X once, instead of on every container type. And you can specialize some containers for X because of UFCS. See Jacob's example.

You would also have to decide on an explicit convention of construction when T is a user-defined type (e.g. define a constructor taking an input range), as such a function would effectively formalise it.

Most definitely. I think any D-based container that can't be constructed from a range of values isn't worth implementing.

(By the way, the template instantiation shortcut syntax only works when the only argument has exactly one token; your example code has an error.)

Yes, I realized this after posting, but figured the point would get across ;) I sometimes miss being able to do this in my real code, the omission of parentheses for template instantiation is an awesome feature!

-Steve

Reply via email to