[C++-sig] Regression in Boost.Python v1.33

Niall Douglas s_sourceforge at nedprod.com
Sat Oct 1 01:58:39 CEST 2005


On 30 Sep 2005 at 19:01, David Abrahams wrote:

> You yourself said that void* isn't supported:

It's only unsupported because BPL hasn't been coded to support it. 
One can specialise for the void type after all, it's just a rather 
unique integral type.

>   http://www.boost.org/libs/python/doc/v2/faq.html#voidptr
> 
> Are you sure that this change is portable, or is it just exploiting a
> vc7.1 bugfeature?

As the test case I posted illustrates, I am using no dodgy casting 
whatsoever. This is simply a case where MSVC7.1 isn't able to deduce 
from a void& return type, probably because void& can't exist and 
type_traits::add_reference<> somehow bypasses MSVC's sanity check for 
this.

The question now becomes how to work around it. Here are my 
solutions:

1. The best solution is to patch type_traits::add_reference<> with a 
specialisation for void whereby it won't ever add a reference to a 
void. AFAIK it's an illegal type anyway. While you're at it, patch 
type_traits::add_cv<> to never add const volatile to void either as 
that also never makes sense.

2. The other solution is to replace registered.hpp with what I have 
attached. I particularly dislike the "const volatile void" template 
specialisation :(

Cheers,
Niall




-------------- next part --------------
// Copyright David Abrahams 2002.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef REGISTERED_DWA2002710_HPP
# define REGISTERED_DWA2002710_HPP
# include <boost/python/type_id.hpp>
# include <boost/python/converter/registry.hpp>
# include <boost/python/converter/registrations.hpp>
# include <boost/type_traits/transform_traits.hpp>
# include <boost/type_traits/cv_traits.hpp>
# include <boost/detail/workaround.hpp>

namespace boost {

// You'll see shared_ptr mentioned in this header because we need to
// note which types are shared_ptrs in their registrations, to
// implement special shared_ptr handling for rvalue conversions.
template <class T> class shared_ptr;

namespace python { namespace converter { 

struct registration;

namespace detail
{
  template <class T>
  struct registered_base
  {
      static registration const& converters;
  };
}

template <class T>
struct registered
  : detail::registered_base<
        typename add_reference<
            typename add_cv<T>::type
        >::type
    >
{
};

# if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
    && !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
// collapses a few more types to the same static instance.  MSVC7.1
// fails to strip cv-qualification from array types in typeid.  For
// some reason we can't use this collapse there or array converters
// will not be found.
template <class T>
struct registered<T&>
  : registered<T> {};
# endif

//
// implementations
//
namespace detail
{
  inline void
  register_shared_ptr0(...)
  {
  }
  
  template <class T>
  inline void
  register_shared_ptr0(shared_ptr<T>*)
  {
      registry::lookup_shared_ptr(type_id<shared_ptr<T> >());
  }
  
  template <class T>
  inline void
  register_shared_ptr1(T const volatile*)
  {
      detail::register_shared_ptr0((T*)0);
  }
  
  template <class T>
  registration const& 
  registry_lookup()
  {
      detail::register_shared_ptr1((T*)0);
      return registry::lookup(type_id<T&>());
  }

  template <>
  registration const& 
  registry_lookup<const volatile void>()
  {
      detail::register_shared_ptr1((void*)0);
      return registry::lookup(type_id<void>());
  }

  template <class T>
	  registration const& registered_base<T>::converters = detail::registry_lookup<typename remove_reference<T>::type>();

}

}}} // namespace boost::python::converter

#endif // REGISTERED_DWA2002710_HPP


More information about the Cplusplus-sig mailing list