[C++-sig] variable argument numberand BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS

Matthew Scouten (TT) Matthew.Scouten at tradingtechnologies.com
Thu May 21 18:45:58 CEST 2009


Well I think that's probably the 'proper' way to do things, but I
usually use the stupid-but-obvious ways.

Overloaded functions:
Class A
{
	void info_1(int i){//Do Stuff}
	void info_2(){//Do Stuff}
}

class_<A>("A")
      .def("info",&A::info_1)
	.def("info",&A::info_2)

Boost::python will sort out which to call. If bp can't correctly
distinguish the types, there may be surprises. (bool vs. int) 

Functions with defaults:
Class A
{
	void info(int i = 0){//Do Stuff}
}

class_<A>("A")
      .def("info",
            &A::info, 
            (arg('i') = 0) 
          )






-----Original Message-----
From:
cplusplus-sig-bounces+matthew.scouten=tradingtechnologies.com at python.org
[mailto:cplusplus-sig-bounces+matthew.scouten=tradingtechnologies.com at py
thon.org] On Behalf Of William Ladwig
Sent: Thursday, May 21, 2009 11:31 AM
To: Development of Python/C++ integration
Subject: Re: [C++-sig] variable argument numberand
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS

I haven't tried this myself, but I think all you need to do to wrap the
member function is this:

.def("info", (void(A::*)(int))0, A_info_overloads());

Hope this helps,
Bill

-----Original Message-----
From: cplusplus-sig-bounces+wladwig=wdtinc.com at python.org
[mailto:cplusplus-sig-bounces+wladwig=wdtinc.com at python.org] On Behalf
Of Hans Roessler
Sent: Thursday, May 21, 2009 8:40 AM
To: cplusplus-sig at python.org
Subject: [C++-sig] variable argument number and
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS


Hello,
I try to wrap a class with a function info([int arg]) that takes either
zero or one argument (exact colde below). For some reason I can't get
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS to work.

The examples at
http://www.boost.org/doc/libs/1_39_0/libs/python/doc/tutorial/doc/html/p
ython/functions.html#python.overloading and
http://www.boost.org/doc/libs/1_39_0/libs/python/doc/v2/overloads.html#B
OOST_PYTHON_FUNCTION_OVERLOADS-spec only show the situation where either
- the *member* function has up to three arguments with default values
assigned or
- three *free* functions have one to three  arguments.

I don't find an example where a class has several *member* functions
with the same name, that take a variable number of (non-default!)
arguments.

My attempt below gives the error
"pytest.cpp:17: error: no matching function for call to
'boost::python::class_<A, boost::python::detail::not_specified,
boost::python::detail::not_specified,
boost::python::detail::not_specified>::def(const char [5], <unresolved
overloaded function type>, A_info_overloads)'"

Do I have to replace the ".def("info",&A::info, ..." with something like
".def("foo", (void(*)(int,int))0, ..." as shown in the Auto-Overloading
section in the tutorial? If yes, how must this function signature look
like? It doesn't work like this.

Hope someone can help
Hans

=== pytest.py ===
#include <boost/python.hpp>
#include <stdio.h>

using namespace boost::python;

class A{
public:
  void info() {printf("This is an A\n");}
  void info(int arg) {printf("Unnecessary arg.\n");}
};

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(A_info_overloads, info, 0,1)

BOOST_PYTHON_MODULE(test)
{
  class_<A>("A")
      .def("info",&A::info,A_info_overloads()) //line 17
    ;
}



      
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig at python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig at python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


More information about the Cplusplus-sig mailing list