I made some progress with the removing constness issue, but now I'm having problems that seem to be related to some kind of interaction between virtualness, function transformation and return value policies.
The attached .hh and .pypp files illustrate the problem. The transformation is applied correctly to a non-virtual member function, but something goes wrong when the function is virtual. -- Pertti
class C {}; class A { protected: virtual ~A(); }; class B { public: virtual C *h(A const & x); // this does not work //C *h(A const & x); // this works //virtual C *h(); // and this };
import pyplusplus from pygccxml import declarations from pyplusplus import function_transformers as FT from pyplusplus.module_builder.call_policies import * def remove_const_ref(type): """Converts "T const&" into "T &" """ if declarations.type_traits.is_reference(type): t = declarations.cpptypes.reference_t(declarations.type_traits.remove_const(type.base)) return t return type mb = pyplusplus.module_builder.module_builder_t(["virtual_const.hh"]) h = mb.mem_fun( 'h' ) h.add_transformation( FT.modify_type(0, remove_const_ref ) ) h.call_policies = return_internal_reference() mb.build_code_creator( module_name="virtual_const" ) mb.write_module("virtual_const_bindings.cpp")
/usr/include/boost/python/detail/invoke.hpp: In function âPyObject* boost::python::detail::invoke(boost::python::detail::invoke_tag_<false, false>, const RC&, F&, AC0&, AC1&) [with RC = boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converter, F = boost::python::api::object (*)(B&, A&), AC0 = boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t0, AC1 = boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t1]â: /usr/include/boost/python/detail/caller.hpp:223: instantiated from âPyObject* boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]â /usr/include/boost/python/object/py_function.hpp:38: instantiated from âPyObject* boost::python::objects::caller_py_function_impl<Caller>::operator()(PyObject*, PyObject*) [with Caller = boost::python::detail::caller<boost::python::api::object (*)(B&, A&), boost::python::return_internal_reference<1u, boost::python::default_call_policies>, boost::mpl::vector3<boost::python::api::object, B&, A&> >]â virtual_const_bindings.cpp:51: instantiated from here /usr/include/boost/python/detail/invoke.hpp:75: virhe: no match for call to â(const boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>) (boost::python::api::object)â /usr/include/boost/python/detail/caller.hpp: In static member function âstatic const PyTypeObject* boost::python::detail::converter_target_type<ResultConverter>::get_pytype() [with ResultConverter = boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>]â: /usr/include/boost/python/detail/caller.hpp:242: instantiated from âstatic boost::python::detail::py_func_sig_info boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::signature() [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]â /usr/include/boost/python/object/py_function.hpp:48: instantiated from âboost::python::detail::py_func_sig_info boost::python::objects::caller_py_function_impl<Caller>::signature() const [with Caller = boost::python::detail::caller<boost::python::api::object (*)(B&, A&), boost::python::return_internal_reference<1u, boost::python::default_call_policies>, boost::mpl::vector3<boost::python::api::object, B&, A&> >]â virtual_const_bindings.cpp:51: instantiated from here /usr/include/boost/python/detail/caller.hpp:102: virhe: âstruct boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object (*)(B&, A&), Policies = boost::python::return_internal_reference<1u, boost::python::default_call_policies>, Sig = boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converterâ has no member named âget_pytypeâ
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig