3434# include < boost/python/detail/defaults_def.hpp>
3535# include < boost/python/signature.hpp>
3636# include < boost/python/init.hpp>
37+ # include < boost/python/args_fwd.hpp>
3738
3839namespace boost { namespace python {
3940
@@ -120,8 +121,9 @@ template <
120121class class_ : public objects ::class_base
121122{
122123 public: // types
123- typedef objects::class_base base;
124-
124+ typedef objects::class_base base;
125+ typedef T wrapped_type;
126+
125127 typedef class_<T,X1,X2,X3> self;
126128 BOOST_STATIC_CONSTANT (bool , is_copyable = (!detail::has_noncopyable<X1,X2,X3>::value));
127129
@@ -201,7 +203,7 @@ class class_ : public objects::class_base
201203 template <class F >
202204 self& def (char const * name, F f)
203205 {
204- this ->def_impl (name, f, default_call_policies (), 0 , &f);
206+ this ->def_impl (name, f, detail::keywords<>(), default_call_policies (), 0 , &f);
205207 return *this ;
206208 }
207209
@@ -236,6 +238,13 @@ class class_ : public objects::class_base
236238 return *this ;
237239 }
238240
241+ template <class Arg1T , class Arg2T , class Arg3T , class Arg4T >
242+ self& def (char const * name, Arg1T arg1, Arg2T const & arg2, Arg3T const & arg3, Arg4T const & arg4)
243+ {
244+ dispatch_def (&arg2, name, arg1, arg2, arg3, arg4);
245+ return *this ;
246+ }
247+
239248 template <detail::operator_id id, class L , class R >
240249 self& def (detail::operator_<id,L,R> const & op)
241250 {
@@ -297,22 +306,32 @@ class class_ : public objects::class_base
297306
298307 private: // helper functions
299308
300- template <class Fn , class Policies >
301- inline void def_impl (char const * name, Fn fn, Policies const & policies
302- , char const * doc, ...)
309+ template <class Fn , class Policies , class Keywords >
310+ inline void def_impl (
311+ char const * name
312+ , Fn fn
313+ , Keywords const & keywords
314+ , Policies const & policies
315+ , char const * doc
316+ , ...)
303317 {
304318 objects::add_to_namespace (
305319 *this , name,
306320 make_function (
307- // This bit of nastiness casts F to a member function of T if possible.
321+ // This bit of nastiness casts F to a member function of T if possible.
308322 detail::member_function_cast<T,Fn>::stage1 (fn).stage2 ((T*)0 ).stage3 (fn)
309- , policies)
323+ , policies, keywords )
310324 , doc);
311325 }
312326
313327 template <class F >
314- inline void def_impl (char const * name, F f, default_call_policies const &
315- , char const * doc, object const *)
328+ inline void def_impl (
329+ char const * name
330+ , F f
331+ , detail::keywords<> const &
332+ , default_call_policies const &
333+ , char const * doc
334+ , object const *)
316335 {
317336 objects::add_to_namespace (*this , name, f, doc);
318337 }
@@ -332,33 +351,60 @@ class class_ : public objects::class_base
332351 name, overloads, *this , detail::get_signature (sig));
333352 }
334353
335- template <class Fn , class CallPolicyOrDoc >
354+ template <class Fn , class A1 >
336355 void dispatch_def (
337356 void const *,
338357 char const * name,
339358 Fn fn,
340- CallPolicyOrDoc const & policy_or_doc )
359+ A1 const & a1 )
341360 {
342- typedef detail::def_helper<CallPolicyOrDoc> helper;
361+ detail::def_helper<A1> helper (a1);
362+
343363 this ->def_impl (
344- name, fn, helper::get_policy (policy_or_doc),
345- helper::get_doc (policy_or_doc, 0 ), &fn);
364+ name, fn
365+ , helper.keywords ()
366+ , helper.policies ()
367+ , helper.doc ()
368+ , &fn);
346369
347370 }
348371
349- template <class Fn , class CallPolicyOrDoc1 , class CallPolicyOrDoc2 >
372+ template <class Fn , class A1 , class A2 >
350373 void dispatch_def (
351374 void const *,
352375 char const * name,
353376 Fn fn,
354- CallPolicyOrDoc1 const & policy_or_doc1 ,
355- CallPolicyOrDoc2 const & policy_or_doc2 )
377+ A1 const & a1 ,
378+ A2 const & a2 )
356379 {
357- typedef detail::def_helper<CallPolicyOrDoc1> helper;
380+ detail::def_helper<A1,A2> helper (a1,a2);
381+
382+ this ->def_impl (
383+ name, fn
384+ , helper.keywords ()
385+ , helper.policies ()
386+ , helper.doc ()
387+ , &fn);
388+ }
358389
390+ template <class Fn , class A1 , class A2 , class A3 >
391+ void dispatch_def (
392+ void const *,
393+ char const * name,
394+ Fn fn,
395+ A1 const & a1,
396+ A2 const & a2,
397+ A3 const & a3
398+ )
399+ {
400+ detail::def_helper<A1,A2,A3> helper (a1,a2,a3);
401+
359402 this ->def_impl (
360- name, fn, helper::get_policy (policy_or_doc1, policy_or_doc2),
361- helper::get_doc (policy_or_doc1, policy_or_doc2), &fn);
403+ name, fn
404+ , helper.keywords ()
405+ , helper.policies ()
406+ , helper.doc ()
407+ , &fn);
362408 }
363409};
364410
0 commit comments