Pasando la función de Python a Boost C ++

Estoy tratando de aprender sobre las funciones de Boost. Quiero pasar una función de Python a un módulo de C ++ envuelto usando Boost Python. Seguí el ejemplo dado aquí y lo modifiqué para aceptar funciones que toman un argumento de entrada y devuelven algo de salida. Aquí está mi código:

typedef double (op_t)(double); boost::function op; double defaultOperator(double t) { return t; } void setOperator(boost::python::object obj) { op = obj; } double callOperator(double t) { return op(t); } BOOST_PYTHON_MODULE(op1) { op = &defaultOperator; def("setOperator", &setOperator); def("callOperator", &callOperator); } 

Cuando trato de comstackr esto, recibo un error en mi función setOperator que dice que cannot convert 'boost::python::api::object' to 'double' in return . El código funciona si sustituyo la línea typedef void (op_t)(double); con typedef void (op_t)(double); y cambiar callOperator para devolver void. Esto me permite pasar funciones de Python que pueden operar con argumentos pero no devuelven nada.

¿Qué esta mal en mi codigo? ¿Cómo debo corregirlo para pasar una función de Python que devuelve un valor?

Después de mucha búsqueda y algunas pruebas y errores, logré modificar mi código para que funcione. Tuve que crear una estructura de envoltorio para el objeto Boost Python, que incluía un método de operator() , de modo que el objeto envuelto pudiera convertirse en una función de refuerzo antes de ser asignado a la variable op . Aquí está el código modificado:

 struct op_wrapper_t { op_wrapper_t( object callable ) : _callable( callable ) {} double operator()(double t) { return extract(_callable(t)); } object _callable; }; void setOperator(object obj) { op = boost::function( op_wrapper_t(obj) ); } 

Seguí un procedimiento similar al de este post . Sin embargo, todavía no entiendo por qué no se necesita tal envoltorio / conversión para las funciones que devuelven el vacío.