$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