Boost logo

Boost :

From: David Bradley (dbradley_at_[hidden])
Date: 2003-02-05 16:02:07


Pavel Vasiliev wrote:

>Andrei, please don't take me wrong. I felt myself inspired after
>reading your Modern C++ Design and some articles in CUJ. But I'm
>also completely agree with rationale given in QA1-3 at
>http://www.boost.org/libs/smart_ptr/shared_ptr.htm#FAQ
>
>
    Q. I am not convinced. Default parameters can be used where
    appropriate to hide the complexity. Again, why not policies?
    A. Template parameters affect the type. See the answer to the first
    question above.

I don't get this argument. Isn't that exactly what you want. You
wouldn't want people mixing different types smart pointers. And you
definitely don't want people doing things like:

smart_ptr<x> one;
smart_ptr<y> two;

one = two;

Changing T changes the type, how is that different than a secondary
template parameter? And if we're talking complexity, why isn't anyone
seeking to remove traits based iterators from a container classes.
Iterators are pretty hard to create on your own. Creating iterator
classes is something I rarely do, though, just as I expect I'd rarely
create my own smart pointer traits class. But when I do, it's nice to
have the facility and people seem to use iterators fairly effectively.

    Q. Why doesn't shared_ptr have template parameters supplying traits
    or policies to allow extensive user customization?
    A. Parameterization discourages users. The shared_ptr template is
    carefully crafted to meet common needs without extensive
    parameterization. Some day a highly configurable smart pointer may
    be invented that is also very easy to use and very hard to misuse.
    Until then, shared_ptr is the smart pointer of choice for a wide
    range of applications. (Those interested in policy based smart
    pointers should read Modern C++ Design
    <http://cseng.aw.com/book/0,,0201704315,00.html> by Andrei
    Alexandrescu.)

If parameterization discourages users, good, software engineers should
be doing the programming not the users ;-). Seriously, I encountered few
serious C++ people who would gasp at using std::string or
std::vector<int>::const_iterator.

    Q. There are several variations of shared pointers, with different
    tradeoffs; why does the smart pointer library supply only a single
    implementation? It would be useful to be able to experiment with
    each type so as to find the most suitable for the job at hand?
    A. An important goal of shared_ptr is to provide a standard
    shared-ownership pointer. Having a single pointer type is important
    for stable library interfaces, since different shared pointers
    typically cannot interoperate, i.e. a reference counted pointer
    (used by library A) cannot share ownership with a linked pointer
    (used by library B.)

Wouldn't it be easier to just have one container class then as well? I
mean all these container classes, if my code uses deque's but the
library needs a vector, I have to convert my deque into a vector. Maybe
smart ptr's shouldn't really be passed across library boundaries anyway.
There's all kind of allocator issues and such. In the dynamic library
world, you don't want library code freeing things allocated by the
application and visa versa. So avoid policy based smart pointers for
this reason isn't going to solve the problem anyway.

The only resistance I've seen when working with people and policy based
smart pointers is from a debugging standpoint. Debuggers, and crashes
with the type names get to be a bit daunting, but you get used to that
if you're going to use the STL.

David Bradley





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