|
Boost : |
From: Douglas Gregor (gregod_at_[hidden])
Date: 2002-01-23 12:56:40
On Wednesday 23 January 2002 12:50 pm, you wrote:
> I propose a very simple patch to ref.hpp which allows one to portably
> determine whether a type is a reference_wrapper, and to extract its "value
> type":
[snip]
> There's a bunch of other code needed to make this useful, but it introduces
> a dependency on type_traits in the no-partial-spec. case, so I guess that
> should go in a separate file.
>
> I happen to need something exactly like this for Boost.Python. Thoughts?
>
> -Dave
I use the same thing in Boost.Function. From boost/function/function_base.hpp
// Determine if the incoming argument is a reference_wrapper
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template<typename T>
struct is_ref
{
BOOST_STATIC_CONSTANT(bool, value = false);
};
template<typename T>
struct is_ref<reference_wrapper<T> >
{
BOOST_STATIC_CONSTANT(bool, value = true);
};
#else // no partial specialization
typedef char yes_type;
typedef double no_type;
no_type is_ref_tester(...);
template<typename T>
yes_type is_ref_tester(reference_wrapper<T>*);
template<typename T>
struct is_ref
{
static T* t;
BOOST_STATIC_CONSTANT(bool,
value = (sizeof(is_ref_tester(t)) == sizeof(yes_type)));
};
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
I'd be glad to have any form of this code in ref.hpp, and get it out of
detail::function.
Doug
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk