Boost logo

Boost :

From: Brian McNamara (lorgon_at_[hidden])
Date: 2003-10-06 21:18:12


On Mon, Oct 06, 2003 at 09:37:00PM -0400, David Abrahams wrote:
> Brian McNamara <lorgon_at_[hidden]> writes:
> > Maybe another way to state my point is that I see container_traits as a
> > "concept wrapper" rather than a "module". It takes a concept (as
> > described by, e.g., the standard) and wraps it in a more convenient and
> > generic interface. This allows more types to model the concept (e.g.
> > an array can be a Container when viewed via container_traits) and
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> Your language, if not your thinking, is somewhat muddled at this
> point. Maybe you need to rephrase for the rest of us? Either an
> array satisfies the Container concept or it doesn't. Unless you're
> changing the standard Container concept, it doesn't.

My understanding is:

An array is not a Container (it does not model the concept described by
the standard).

The original container_traits proposal was designed with one of its
goals being: to allow some data types (like arrays) which do not model
the concept to be viewed through a uniform interface that makes them
appear as if they do model the concept.

For each attribute in the Container concept, there is a corresponding
attribute inside container_traits.

For every type that models the Container concept, access to the
concept attributes via container_traits yields the same results as
"direct" access to the attributes. For example:
   typedef vector<int> V;
   V v;
   container_traits::value_type<V>::type === V::value_type
   // and also for iterator_type, etc. Maybe also for stuff like
   container_traits::begin(v) === v.begin()
   // but I haven't studied the actual container_traits proposal well
   // enough to know if it includes stuff like this.

For some types which do not model the Container concept,
container_traits provides a way to view these types as thought they did
model the concept. For example:
   typedef int A[10]; // or whatever the syntax is here, I forget
   A a;
   container_traits::value_type<A>::type === int
   container_traits::begin(a) === &a[0]

Let me know if my understanding here is flawed at any point along the
line.

Of course, the utility of container_traits is thus that you can
 - take any generic algorithm which works on Containers
 - rewrite it to access Container attributes via container_traits
   instead of accessing these attributes directly
 - now your new algorithm
    - behaves exactly the same on types which model Container
    - also now works on some other Container-like types (e.g. array)

Effectively container_traits helps defines a new concept. We might
call this new concept ContainerAsViewedViaContainerTraits. It is a
super-concept (anti-refinement) of Container, in that
 - for every type T which models Container
    - T also models ContainerAsViewedViaContainerTraits

-- 
-Brian McNamara (lorgon_at_[hidden])

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk