|
Boost : |
From: Jonathan Turkanis (technews_at_[hidden])
Date: 2004-01-27 12:01:48
"Peter Dimov" <pdimov_at_[hidden]> wrote in messag:
> >
> >> Howard Hinnant wrote:
> >>> <snip>
> >>> And I submit that:
> >>> S<T[], my_deleter>
> >>> is more elegant syntax than:
> >>> S_array<T, my_deleter>
<snip>
> > Need to be? No. But I still like it. <shrug> I was convinced
> > because that's how a newbie expected it to work.
>
> I'm starting to not like it. :-) The problem is:
>
> template<class X> void f(S_ptr<X> px);
>
> where f doesn't support arrays. A reasonably common occurence.
S_array<>
> doesn't match, but S_ptr<T[]> does. The author of f would need to
learn
> about enable_if to prevent array pointers from being passed to f.
This is
> not good, although the exact degree of not-goodness is somewhat
debatable.
>
I'm not sure I see the problem. (Maybe because I already implemented
this feature :-)
If pointers to objects and pointers to arrays need different
treatment, one can use:
template<class X> void f(S_ptr<X> px);
template<class X> void f(S_ptr<X[]> px);
If one only wants to support pointers to objects, but forgets that the
array case is subsumed by
template<class X> void f(S_ptr<X> px);
I think there will almost certianly be a compiler error if somepone
tries to pass an array pointer, since the dereferencing operations are
not supported. In my implementation, the user would likely be directed
to something like:
element_type* operator->() const
{ BOOST_STATIC_ASSERT(!is_array); return ptr(); }
If f declares a variable of type X or X& and tries to assign to it,
there will also be an error. (On VC7.1 I get the message 'array
initializer needs curly braces', or 'reference to a zero-sized array
is illegal')
Can you think of an example where a compiler error would be
undesirable, or where no error will occur until runtime?
Regards,
Jonathan
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk