Boost logo

Boost Users :

From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2008-02-21 06:04:45


Hello *!

As already asked many times in the list about the broken HAS_XXX (
BOOST_MPL_HAS_XXX_TRAIT_DEF<http://www.boost.org/libs/mpl/doc/refmanual/has-xxx-trait-def.html>)
mpl I would like to ask following:

If I use this code (on MSVC 7.1 compiler) and I have a type like:

struct test { int xxx; };

and use the macro

namespace x
{
   BOOST_MPL_HAS_XXX_TRAIT_DEF(xxx);
}

This will result in the following code fragment:

--------------------------------------------------------------------------------------------
/// included code from has_xxx.hpp
namespace boost
{
  namespace mpl
  {
    namespace aux
    {
      template< typename T > struct msvc71_sfinae_helper
      {
        typedef void type;
      };
    }
  }
}

namespace sn
{
  template< typename T, typename U = void >
  struct has_xxx_impl_
  {
    static const bool value = false;
    typedef boost::mpl::bool_<value> type;
  };

  template< typename T >
  struct has_xxx_impl_< T , typename boost::mpl::aux::msvc71_sfinae_helper<
typename T::xxx >::type >
  {
    static const bool value = true;
    typedef boost::mpl::bool_<value> type;
  };

  template< typename T, typename fallback_ = boost::mpl::bool_<false> >
  struct has_xxx : has_xxx_impl_<T>
  { };
}
--------------------------------------------------------------------------------------------------

For me this will clearly fail, since T::xxx is not a type but an integer
member of the struct. If xxx would be a member function it would not be a
type as well, so has_xxx can only determine if there is some nested class
type or a typedef within the inspected type. Is this correct?

Many thanks,
Ovanes



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net