[C++-sig] Regression in Boost.Python v1.33
Niall Douglas
s_sourceforge at nedprod.com
Fri Oct 14 12:42:37 CEST 2005
On 12 Oct 2005 at 11:41, David Abrahams wrote:
> > Any movement on the below? Do you want me to submit a patch to
> > type_traits or just to BPL?
>
> >> 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.
>
> I am surprised that add_reference doesn't already act that way. If
> that is enough to fix your problem, I think you should post, and we
> should accept, the patch.
You were right that add_reference /does/ already act that way. I
tried a test example with the same form as the bug and no matter what
I do, the compiler compiles it just fine.
Whatever is going on, it seems that you need to be deep down inside
BPL to see it :(
The easiest solution is a specialisation for const volatile void,
exampled by the attached registered.hpp.
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