Boost logo

Boost :

From: ERICSSON,JOHAN (A-Sonoma,ex1) (johan_ericsson_at_[hidden])
Date: 2001-11-16 11:53:30


-----Original Message-----
From: Jeff King [mailto:peff-boost_at_[hidden]]
Sent: Thursday, November 15, 2001 11:45 PM
To: boost_at_[hidden]
Subject: [boost] polymorphic containers

I'm considering a new poly_ptr class for boost; the intent is to aid in
the creation of heterogenous (polymorphic) containers.
...

// declare 'derived1' and 'derived2', both inheriting from 'parent'
int main() {
  typedef poly_ptr<parent> phandle;
  typedef std::vector<phandle> pvector;

  pvector v;

  v.push_back(phandle::create(new derived1));
  v.push_back(phandle::create(new derived2));

  for(pvector::iterator i = v.begin(); i != v.end(); ++i)
    (*i)->some_virtual_function();

  return 0;
}

The syntax is a little funny (you must create either a NULL poly_ptr
with poly_ptr(), or you must use the static create() function); this is
because create() is a templated function that grabs the necessary type
info. You also still have to deal with the double dereference for the
iterator; I don't think it's possible to deal with this using standard
containers and not using a dereferencing iterator adaptor.

---
Jeff,
I'm using a poly_ptr template extensively within my code. I konw that you
have retracted your proposal but I just wanted to give my two cents.
1. Don't allow the poly_ptr to have a NULL value. This simplifies both the
implementation of poly_ptr and the client significantly. The client no
longer has to check for a NULL poly_ptr. If the client needs an optional
poly_ptr then it can use an optional class or something like that. This
restriction also, in my opinion, makes the poly_ptr act more like a value
semantic class. It is also more in the spirit of C++, not to supply a
default constructor if the default constructor places an object in a NULL
state.
2. I didn't understand why you needed to use the create() function to create
a poly_ptr. I simply use a conversion constructor.
poly_ptr(const T& t):m_pT(t.Clone()){}
Usage:
poly_ptr<parent> p(child());
a. This preserves the value-oriented semantics, as you are not taking
ownership of a naked pointer. You are copying a value into the poly_ptr.
This is the same way that the STL containers work. They copy values, they
don't take ownership.
b. Perhaps you needed the create() function to customize the signature of
the Clone() (clone(), copy(), Copy()) method...
---
Anyways, I think a poly_ptr object still has value over a broader variant
object. The usage of the poly_ptr is bound to be easier.
Also, I don't think the poly_ptr can be handled adequately by a policy based
smart pointer object. The semantics that I would like to see(value
semantics, copying to create), are so different from other pointers that the
policies would need to be quite complicated in order to allow the pointer to
act properly.
Johan

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