|
46 | 46 | # include <boost/utility.hpp> |
47 | 47 | # include <boost/detail/workaround.hpp> |
48 | 48 |
|
| 49 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 50 | +# include <boost/mpl/and.hpp> |
| 51 | +# include <boost/type_traits/is_member_pointer.hpp> |
| 52 | +# endif |
| 53 | + |
49 | 54 | namespace boost { namespace python { |
50 | 55 |
|
51 | 56 | enum no_init_t { no_init }; |
@@ -97,6 +102,16 @@ namespace detail |
97 | 102 | SelectHolder::register_(); |
98 | 103 | } |
99 | 104 |
|
| 105 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 106 | + template <class T> |
| 107 | + struct is_data_member_pointer |
| 108 | + : mpl::and_< |
| 109 | + is_member_pointer<T> |
| 110 | + , mpl::not_<is_member_function_pointer<T> > |
| 111 | + > |
| 112 | + {}; |
| 113 | +# endif |
| 114 | + |
100 | 115 | namespace error |
101 | 116 | { |
102 | 117 | // |
@@ -293,25 +308,53 @@ class class_ : public objects::class_base |
293 | 308 | template <class D> |
294 | 309 | self& def_readonly(char const* name, D const& d) |
295 | 310 | { |
296 | | - return this->def_readonly_impl(name, d, 0); |
| 311 | + return this->def_readonly_impl( |
| 312 | + name, d |
| 313 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 314 | + , detail::is_data_member_pointer<D>() |
| 315 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 316 | + , 0 |
| 317 | +# endif |
| 318 | + ); |
297 | 319 | } |
298 | 320 |
|
299 | 321 | template <class D> |
300 | 322 | self& def_readwrite(char const* name, D const& d) |
301 | 323 | { |
302 | | - return this->def_readwrite_impl(name, d, 0); |
| 324 | + return this->def_readwrite_impl( |
| 325 | + name, d |
| 326 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 327 | + , detail::is_data_member_pointer<D>() |
| 328 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 329 | + , 0 |
| 330 | +# endif |
| 331 | + ); |
303 | 332 | } |
304 | | - |
| 333 | + |
305 | 334 | template <class D> |
306 | 335 | self& def_readonly(char const* name, D& d) |
307 | 336 | { |
308 | | - return this->def_readonly_impl(name, d, 0); |
| 337 | + return this->def_readonly_impl( |
| 338 | + name, d |
| 339 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 340 | + , detail::is_data_member_pointer<D>() |
| 341 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 342 | + , 0 |
| 343 | +# endif |
| 344 | + ); |
309 | 345 | } |
310 | 346 |
|
311 | 347 | template <class D> |
312 | 348 | self& def_readwrite(char const* name, D& d) |
313 | 349 | { |
314 | | - return this->def_readwrite_impl(name, d, 0); |
| 350 | + return this->def_readwrite_impl( |
| 351 | + name, d |
| 352 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 353 | + , detail::is_data_member_pointer<D>() |
| 354 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 355 | + , 0 |
| 356 | +# endif |
| 357 | + ); |
315 | 358 | } |
316 | 359 |
|
317 | 360 | // Property creation |
@@ -400,27 +443,55 @@ class class_ : public objects::class_base |
400 | 443 | private: // helper functions |
401 | 444 |
|
402 | 445 | template <class D, class B> |
403 | | - self& def_readonly_impl(char const* name, D B::*pm_, int) |
| 446 | + self& def_readonly_impl( |
| 447 | + char const* name, D B::*pm_ |
| 448 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 449 | + , mpl::true_ |
| 450 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 451 | + , int |
| 452 | +# endif |
| 453 | + ) |
404 | 454 | { |
405 | 455 | D T::*pm = pm_; |
406 | 456 | return this->add_property(name, make_getter(pm)); |
407 | 457 | } |
408 | 458 |
|
409 | 459 | template <class D, class B> |
410 | | - self& def_readwrite_impl(char const* name, D B::*pm_, int) |
| 460 | + self& def_readwrite_impl( |
| 461 | + char const* name, D B::*pm_ |
| 462 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 463 | + , mpl::true_ |
| 464 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 465 | + , int |
| 466 | +# endif |
| 467 | + ) |
411 | 468 | { |
412 | 469 | D T::*pm = pm_; |
413 | 470 | return this->add_property(name, make_getter(pm), make_setter(pm)); |
414 | 471 | } |
415 | 472 |
|
416 | 473 | template <class D> |
417 | | - self& def_readonly_impl(char const* name, D& d, ...) |
| 474 | + self& def_readonly_impl( |
| 475 | + char const* name, D& d |
| 476 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 477 | + , mpl::false_ |
| 478 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 479 | + , ... |
| 480 | +# endif |
| 481 | + ) |
418 | 482 | { |
419 | 483 | return this->add_static_property(name, make_getter(d)); |
420 | 484 | } |
421 | 485 |
|
422 | 486 | template <class D> |
423 | | - self& def_readwrite_impl(char const* name, D& d, ...) |
| 487 | + self& def_readwrite_impl( |
| 488 | + char const* name, D& d |
| 489 | +# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) |
| 490 | + , mpl::false_ |
| 491 | +# elif BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
| 492 | + , ... |
| 493 | +# endif |
| 494 | + ) |
424 | 495 | { |
425 | 496 | return this->add_static_property(name, make_getter(d), make_setter(d)); |
426 | 497 | } |
@@ -542,10 +613,8 @@ inline void class_<T,X1,X2,X3>::register_() const |
542 | 613 | mpl::bool_<is_copyable>() |
543 | 614 | # if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) |
544 | 615 | , holder_selector::execute((held_type*)0) |
545 | | -# elif BOOST_WORKAROUND(BOOST_MSVC, <= 1300) |
546 | | - , holder_selector::type() |
547 | 616 | # else |
548 | | - , typename holder_selector::type() |
| 617 | + , BOOST_DEDUCED_TYPENAME holder_selector::type() |
549 | 618 | # endif |
550 | 619 | ); |
551 | 620 | } |
|
0 commit comments