$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2006-06-15 15:04:03
> what is your basis for that assertion?
Because I wrote that header thinking (wrongly, because of my ADL
ignorance and VC support) that it would be used for ADL lookup:
//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztañaga 2005.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
//////////////////////////////////////////////////////////////////////////////
#ifndef BOOST_POINTER_CAST_HPP
#define BOOST_POINTER_CAST_HPP
namespace boost {
//static_pointer_cast overload for raw pointers
template<class T, class U>
inline T* static_pointer_cast(U *ptr)
{
return static_cast<T*>(ptr);
}
//..
} // namespace boost
#endif //BOOST_POINTER_CAST_HPP
I wrote this because I wanted to use it though ADL. If
static_pointer_cast<Target>() can't be used through ADL, it's certainly
a very limited header. Unless I know that my pointer can be a raw
pointer, I know all the possible pointer types and I include all the
headers, this header is useless. Until Boost 1.34 this header didn't exist.
But I still see a need for customizable cast functions. Since shared_ptr
is de-facto standard, I'm just proposing new generic cast functions.
What about template specialization?:
//pointer_cast.hpp
namespace boost {
template<class TargetPtr>
class cast_to;
template<class T>
class cast_to<T*>
{
template<class Source>
static T * using_static_cast(Source *source)
{ return static_cast<T*>(source); }
}
} //namespace boost {
namespace boost {
//smart_ptr.hpp
template<class T>
class cast_to<smart_ptr<T> >
{
template<class Source>
static smart_ptr<T>
using_static_cast(const smart_ptr<Source> &source);
}
} //namespace boost {
// pointer independent code
BasePtr d_ptr = ...
typedef typename
boost::pointer_to_other<BasePtr, Base>::type DerivedPtr;
DerivedPtr target = cast_to<DerivedPtr>::using_static_cast(b_ptr);
////////////////////////////////
Sorry if there are errors in the code. Any suggestion? Time to request
cast operator overloading for user classes?
Regards,
Ion