[C++-sig] Convert C++ Class to exposed class and back

Marcus Jannes jannes80 at hotmail.de
Tue Feb 12 20:07:36 CET 2008

Okay, let me explain in detail then:
I got an existing c++ library where there is a class DerivType which i want exposed to python.
There is a function i also want exposed

void fEval( ddf_FctPtr f, interval, interval&)

where the first parameter is a function pointer which is typedef'ed:

typedef DerivType (*ddf_FctPtr)(const DerivType&);

I want to do this in python (argument and return type should be of class DerivType):
def f(x):
   x_temp = DerivType(x)
   return x_temp*x_temp

Now the wrapper should look something like this:

PyObject* _pyfunc_ptr = NULL;

DerivType _pycall(const DerivType& d){
	DerivType c_result;
	//build Python data from C++ data:
	bp::object o(d);
	result = PyEval_CallObject(_pyfunc_ptr, o.ptr()); 
	c_result = bp::extract(result);//http://www.boost.org/libs/python/doc/v2/extract.html
	return c_result;

static PyObject *eval(PyObject *self, PyObject *args){
	PyObject *ddf_function;
	if (!PyArg_ParseTuple(args,"O"
		return NULL; 

		PyErr_Format(PyExc_TypeError,"ddf_function is not callable function");
		return NULL;
	_pyfunc_ptr = ddf_function; //cache new callback
	interval i1(10); interval i2; //just for testing
	return Py_BuildValue("");

Well, i still couldn't get this to work at runtime yet. I am not sure if it is even possible, but i got an example from a book where there is a similar case using double data instead of a class (DerivType) and it seems like doing the trick. If this can be done with boost.python instead of C API or you got any other comments please let me know. 

> Date: Tue, 12 Feb 2008 09:07:22 -0500
> From: seefeld at sympatico.ca
> To: c++-sig at python.org
> Subject: Re: [C++-sig] Convert C++ Class to exposed class and back
> Marcus Jannes wrote:
>> Thank you, i think this is exactly what i need. Regarding your question why i want to use it in this way:
>> It is because i want to convert Python function objects to C++ function pointers which get passed to a another function and this seems to be the way to do it. The boost.python FAQ (see: http://www.boost.org/libs/python/doc/v2/faq.html ) states that it isnt possible, unless i misunderstood it. So i am trying it in C API. Now i should be able to :-). If there is any better way to do it, i would be happy to know.
> I think you misunderstood. The problem is not with the API, but with the 
> underlying object model: As Dave notes in the FAQ, a (C, C++) function 
> pointer is not an object, and thus has no state to carry around.
> Unless your function takes not only a function pointer but also some 
> closure argument (which would then carry that state), you are out of luck.
> In contrast, if you do get to pass a closure argument, you can pass a 
> python (callable) there, and then implement the function whose pointer 
> you pass such that it simply invokes that callable.
> In either case, the problem is the same, no matter whether you try to 
> solve it with Python's C API or boost.python.
> HTH,
> 		Stefan
> -- 
>        ...ich hab' noch einen Koffer in Berlin...
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig

Kostenlose Messenger Emoticons! Hier downloaden!

More information about the Cplusplus-sig mailing list