mirror of
https://github.com/boostorg/utility.git
synced 2025-08-01 22:04:31 +02:00
added is_reference_wrapper<>, unwrap_reference<>
[SVN r12470]
This commit is contained in:
@@ -25,6 +25,7 @@ namespace boost
|
|||||||
template<class T> class reference_wrapper
|
template<class T> class reference_wrapper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef T type;
|
||||||
|
|
||||||
explicit reference_wrapper(T & t): t_(t) {}
|
explicit reference_wrapper(T & t): t_(t) {}
|
||||||
|
|
||||||
@@ -57,6 +58,86 @@ template<class T> inline reference_wrapper<T const> BOOST_REF_CONST cref(T const
|
|||||||
|
|
||||||
# undef BOOST_REF_CONST
|
# undef BOOST_REF_CONST
|
||||||
|
|
||||||
|
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
template<typename T>
|
||||||
|
class is_reference_wrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BOOST_STATIC_CONSTANT(bool, value = false);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class is_reference_wrapper<reference_wrapper<T> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BOOST_STATIC_CONSTANT(bool, value = true);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class unwrap_reference
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class unwrap_reference<reference_wrapper<T> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
# else // no partial specialization
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
typedef char (&yes_reference_wrapper_t)[1];
|
||||||
|
typedef char (&no_reference_wrapper_t)[2];
|
||||||
|
|
||||||
|
no_reference_wrapper_t is_reference_wrapper_test(...);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
yes_reference_wrapper_t is_reference_wrapper_test(reference_wrapper<T>*);
|
||||||
|
|
||||||
|
template<bool wrapped>
|
||||||
|
struct reference_unwrapper
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct apply
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct reference_unwrapper<true>
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct apply
|
||||||
|
{
|
||||||
|
typedef typename T::type type;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class is_reference_wrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static T* t;
|
||||||
|
BOOST_STATIC_CONSTANT(
|
||||||
|
bool, value = (
|
||||||
|
sizeof(detail::is_reference_wrapper_test(t))
|
||||||
|
== sizeof(detail::yes_reference_wrapper_t)));
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class unwrap_reference
|
||||||
|
: public detail::reference_unwrapper<
|
||||||
|
is_reference_wrapper<T>::value
|
||||||
|
>::template apply<T>
|
||||||
|
{};
|
||||||
|
|
||||||
|
# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // #ifndef BOOST_REF_HPP_INCLUDED
|
#endif // #ifndef BOOST_REF_HPP_INCLUDED
|
||||||
|
Reference in New Issue
Block a user