Boost logo

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