2929# include < boost/python/detail/operator_id.hpp>
3030# include < boost/python/detail/def_helper.hpp>
3131# include < boost/python/detail/force_instantiate.hpp>
32+ # include < boost/python/detail/unwrap_type_id.hpp>
33+ # include < boost/python/detail/unwrap_wrapper.hpp>
3234
3335# include < boost/type_traits/is_same.hpp>
3436# include < boost/type_traits/is_member_function_pointer.hpp>
@@ -151,7 +153,7 @@ namespace detail
151153// This is the primary mechanism through which users will expose
152154// C++ classes to Python.
153155template <
154- class T // class being wrapped
156+ class W // class being wrapped
155157 , class X1 // = detail::not_specified
156158 , class X2 // = detail::not_specified
157159 , class X3 // = detail::not_specified
@@ -160,9 +162,9 @@ class class_ : public objects::class_base
160162{
161163 public: // types
162164 typedef objects::class_base base;
163- typedef class_<T ,X1,X2,X3> self;
164- typedef typename objects::class_metadata<T ,X1,X2,X3> metadata;
165- typedef T wrapped_type;
165+ typedef class_<W ,X1,X2,X3> self;
166+ typedef typename objects::class_metadata<W ,X1,X2,X3> metadata;
167+ typedef W wrapped_type;
166168
167169 private: // types
168170
@@ -175,7 +177,7 @@ class class_ : public objects::class_base
175177 id_vector ()
176178 {
177179 // Stick the derived class id into the first element of the array
178- ids[0 ] = type_id<T>( );
180+ ids[0 ] = detail::unwrap_type_id ((W*) 0 , (W*) 0 );
179181
180182 // Write the rest of the elements into succeeding positions.
181183 type_info* p = ids + 1 ;
@@ -231,7 +233,9 @@ class class_ : public objects::class_base
231233 template <class F >
232234 self& def (char const * name, F f)
233235 {
234- this ->def_impl (name, f, detail::def_helper<char const *>(0 ), &f);
236+ this ->def_impl (
237+ detail::unwrap_wrapper ((W*)0 )
238+ , name, f, detail::def_helper<char const *>(0 ), &f);
235239 return *this ;
236240 }
237241
@@ -250,9 +254,10 @@ class class_ : public objects::class_base
250254 // def(name, function, doc_string, policy)
251255
252256 this ->def_impl (
253- name, fn
254- , detail::def_helper<A1,A2>(a1,a2)
255- , &fn);
257+ detail::unwrap_wrapper ((W*)0 )
258+ , name, fn
259+ , detail::def_helper<A1,A2>(a1,a2)
260+ , &fn);
256261
257262 return *this ;
258263 }
@@ -261,9 +266,10 @@ class class_ : public objects::class_base
261266 self& def (char const * name, Fn fn, A1 const & a1, A2 const & a2, A3 const & a3)
262267 {
263268 this ->def_impl (
264- name, fn
265- , detail::def_helper<A1,A2,A3>(a1,a2,a3)
266- , &fn);
269+ detail::unwrap_wrapper ((W*)0 )
270+ , name, fn
271+ , detail::def_helper<A1,A2,A3>(a1,a2,a3)
272+ , &fn);
267273
268274 return *this ;
269275 }
@@ -371,7 +377,8 @@ class class_ : public objects::class_base
371377 typedef typename api::is_object_operators<F>::type is_obj_or_proxy;
372378
373379 return this ->make_fn_impl (
374- f, is_obj_or_proxy (), (char *)0 , detail::is_data_member_pointer<F>()
380+ detail::unwrap_wrapper ((W*)0 )
381+ , f, is_obj_or_proxy (), (char *)0 , detail::is_data_member_pointer<F>()
375382 );
376383 }
377384
@@ -381,32 +388,33 @@ class class_ : public objects::class_base
381388 typedef typename api::is_object_operators<F>::type is_obj_or_proxy;
382389
383390 return this ->make_fn_impl (
384- f, is_obj_or_proxy (), (int *)0 , detail::is_data_member_pointer<F>()
391+ detail::unwrap_wrapper ((W*)0 )
392+ , f, is_obj_or_proxy (), (int *)0 , detail::is_data_member_pointer<F>()
385393 );
386394 }
387395
388- template <class F >
389- object make_fn_impl (F const & f, mpl::false_, void *, mpl::false_)
396+ template <class T , class F >
397+ object make_fn_impl (T*, F const & f, mpl::false_, void *, mpl::false_)
390398 {
391399 return python::make_function (f, default_call_policies (), detail::get_signature (f, (T*)0 ));
392400 }
393401
394- template <class D , class B >
395- object make_fn_impl (D B::*pm_, mpl::false_, char *, mpl::true_)
402+ template <class T , class D , class B >
403+ object make_fn_impl (T*, D B::*pm_, mpl::false_, char *, mpl::true_)
396404 {
397405 D T::*pm = pm_;
398406 return python::make_getter (pm);
399407 }
400408
401- template <class D , class B >
402- object make_fn_impl (D B::*pm_, mpl::false_, int *, mpl::true_)
409+ template <class T , class D , class B >
410+ object make_fn_impl (T*, D B::*pm_, mpl::false_, int *, mpl::true_)
403411 {
404412 D T::*pm = pm_;
405413 return python::make_setter (pm);
406414 }
407415
408- template <class F >
409- object make_fn_impl (F const & x, mpl::true_, void *, mpl::false_)
416+ template <class T , class F >
417+ object make_fn_impl (T*, F const & x, mpl::true_, void *, mpl::false_)
410418 {
411419 return x;
412420 }
@@ -462,9 +470,10 @@ class class_ : public objects::class_base
462470 // generic visitor and everything else.
463471 //
464472 // @group def_impl {
465- template <class Helper , class LeafVisitor , class Visitor >
473+ template <class T , class Helper , class LeafVisitor , class Visitor >
466474 inline void def_impl (
467- char const * name
475+ T*
476+ , char const * name
468477 , LeafVisitor
469478 , Helper const & helper
470479 , def_visitor<Visitor> const * v
@@ -473,9 +482,10 @@ class class_ : public objects::class_base
473482 v->visit (*this , name, helper);
474483 }
475484
476- template <class Fn , class Helper >
485+ template <class T , class Fn , class Helper >
477486 inline void def_impl (
478- char const * name
487+ T*
488+ , char const * name
479489 , Fn fn
480490 , Helper const & helper
481491 , ...
@@ -510,7 +520,7 @@ class class_ : public objects::class_base
510520 , Helper const & helper
511521 , mpl::bool_<true >)
512522 {
513- detail::error::virtual_function_default<T ,Fn>::must_be_derived_class_member (
523+ detail::error::virtual_function_default<W ,Fn>::must_be_derived_class_member (
514524 helper.default_implementation ());
515525
516526 objects::add_to_namespace (
@@ -554,7 +564,8 @@ class class_ : public objects::class_base
554564 , ...)
555565 {
556566 this ->def_impl (
557- name
567+ detail::unwrap_wrapper ((W*)0 )
568+ , name
558569 , fn
559570 , detail::def_helper<A1>(a1)
560571 , &fn
@@ -569,23 +580,23 @@ class class_ : public objects::class_base
569580// implementations
570581//
571582
572- template <class T , class X1 , class X2 , class X3 >
573- inline class_<T ,X1,X2,X3>::class_(char const * name, char const * doc)
583+ template <class W , class X1 , class X2 , class X3 >
584+ inline class_<W ,X1,X2,X3>::class_(char const * name, char const * doc)
574585 : base(name, id_vector::size, id_vector().ids, doc)
575586{
576587 this ->initialize (init<>());
577588// select_holder::assert_default_constructible();
578589}
579590
580- template <class T , class X1 , class X2 , class X3 >
581- inline class_<T ,X1,X2,X3>::class_(char const * name, no_init_t )
591+ template <class W , class X1 , class X2 , class X3 >
592+ inline class_<W ,X1,X2,X3>::class_(char const * name, no_init_t )
582593 : base(name, id_vector::size, id_vector().ids)
583594{
584595 this ->initialize (no_init);
585596}
586597
587- template <class T , class X1 , class X2 , class X3 >
588- inline class_<T ,X1,X2,X3>::class_(char const * name, char const * doc, no_init_t )
598+ template <class W , class X1 , class X2 , class X3 >
599+ inline class_<W ,X1,X2,X3>::class_(char const * name, char const * doc, no_init_t )
589600 : base(name, id_vector::size, id_vector().ids, doc)
590601{
591602 this ->initialize (no_init);
0 commit comments