|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-04-10 06:12:44
From: "Douglas Gregor" <gregod_at_[hidden]>
> 'tis done. addressof() has been added as boost/utility/addressof.hpp (also
> included in boost/utility.hpp), along with documentation and some
testcases.
>
> I've also changed reference_wrapper to use addressof instead of the '&'
> operator.
template <typename T>
inline T* addressof(T& v)
{
return reinterpret_cast<T*>(
&reinterpret_cast<detail::addressof_helper&>(v));
}
template <typename T>
inline const T* addressof(const T& v)
{
return reinterpret_cast<const T*>(
&reinterpret_cast<const detail::addressof_helper&>(v));
}
This is the "famous" overloading that compiles 50% of the time; and when it
compiles, you are probably going to get the wrong overload; and T const &
allows you to apply addressof() to rvalues. ;-)
A version that doesn't have these problems:
template <class T> inline T * addressof(T & v)
{
return reinterpret_cast<T*>(
&const_cast<char &>(reinterpret_cast<char const &>(v)));
}
(replace char with detail::addressof_helper if you like; I'm not sure which
is better. I like the char& cast better when T is not a POD.)
C-style casts are much more readable. ;-)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk