pointer_castThe pointer cast functions (boost::static_pointer_cast boost::dynamic_pointer_cast
boost::reinterpret_pointer_cast boost::const_pointer_cast)
provide a way to write generic pointer castings for raw pointers and std::shared_ptr. The functions
are defined in boost/pointer_cast.hpp.
There is test/example code in pointer_cast_test.cpp.
Boost smart pointers usually overload those functions to provide a mechanism to
emulate pointers casts. For example, boost::shared_ptr<...> implements
a static pointer cast this way:
template<class T, class U>
shared_ptr<T> static_pointer_cast(shared_ptr<U> const &r);
Pointer cast functions from boost/pointer_cast.hpp
are overloads of boost::static_pointer_cast, boost::dynamic_pointer_cast,
boost::reinterpret_pointer_cast and boost::const_pointer_cast
for raw pointers and std::shared_ptr. This way when developing pointer type independent classes,
for example, memory managers or shared memory compatible classes, the same code
can be used for raw and smart pointers.
namespace boost {
template<class T, class U>
inline T* static_pointer_cast(U *ptr)
{ return static_cast<T*>(ptr); }
template<class T, class U>
inline T* dynamic_pointer_cast(U *ptr)
{ return dynamic_cast<T*>(ptr); }
template<class T, class U>
inline T* const_pointer_cast(U *ptr)
{ return const_cast<T*>(ptr); }
template<class T, class U>
inline T* reinterpret_pointer_cast(U *ptr)
{ return reinterpret_cast<T*>(ptr); }
template<class T, class U>
inline std::shared_ptr<U> static_pointer_cast(std::shared_ptr<T> ptr);
template<class T, class U>
inline std::shared_ptr<U> dynamic_pointer_cast(std::shared_ptr<T> ptr);
template<class T, class U>
inline std::shared_ptr<U> const_pointer_cast(std::shared_ptr<T> ptr);
template<class T, class U>
inline std::shared_ptr<U> reinterpret_pointer_cast(std::shared_ptr<T> ptr);
} // namespace boost
As you can see from the above synopsis, the pointer cast functions are just wrappers around standard C++ cast operators.
#include <boost/pointer_cast.hpp>
#include <boost/shared_ptr.hpp>
class base
{
public:
virtual ~base()
{
}
};
class derived: public base
{
};
template <class BasePtr>
void check_if_it_is_derived(const BasePtr &ptr)
{
assert(boost::dynamic_pointer_cast<derived>(ptr) != 0);
}
int main()
{
// Create a raw and a shared_ptr
base *ptr = new derived;
boost::shared_ptr<base> sptr(new derived);
// Check that base pointer points actually to derived class
check_if_it_is_derived(ptr);
check_if_it_is_derived(sptr);
// Ok!
delete ptr;
return 0;
}
The example demonstrates how the generic pointer casts help us create pointer independent code.
$Date$
Copyright 2005 Ion Gaztaņaga. Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)