boost.python: вызов функции-члена экземпляра c ++ из встроенного интерпретатора

Я пытаюсь добавить возможности сценариев Python в свое приложение, используя boost.python, Я хотел бы использовать Python для оценки простых выражений в конкретных экземплярах классов C ++, размещенных в моем приложении C ++.

Я написал оболочку Python для простого класса в C ++:

class pyTest1
{
public:
pyTest1():i(1),f(3.14){}

int getint() { return i; }
void setint(int val) { i = val; }

float getfloat() { return f; }
void setfloat(float val) { f = val; }

private:
int i;
float f;
};

BOOST_PYTHON_MODULE(pyTestSpace)
{
class_<pyTest1>("pyTest1", init<>())
.def("getint", &pyTest1::getint)
.def("setint", &pyTest1::setint)
.def("getfloat", &pyTest1::getfloat)
.def("setfloat", &pyTest1::setfloat)
;
}

Учитывая случай pyTest1:

pyTest1 *testInstance = new pyTest1;

Я хотел бы оценить выражение, как это, используя встроенный Python:

result = math.cos(testInstance->getfloat())

Предполагая, что экземпляр класса и выражение (как строка) передаются в функцию C ++ следующим образом:

#include <string>
#include <boost/python.hpp>
#include <graminit.h>

void UseEmbedPython(std::string exp, pyTest1* obj)
{
Py_Initialize();

initpyTestSpace();

PyObject *pDictionary = PyDict_New();

PyDict_SetItemString(pDictionary, "__builtins__", PyEval_GetBuiltins() );
PyRun_String("import math", file_input, pDictionary, pDictionary );

//Need help here!
//Assuming exp is something like "result = math.cos(obj->getfloat())"//How do I make obj's functions accessible to Python interpretter?

PyRun_String(exp.c_str(), file_input, pDictionary, pDictionary );

PyObject *pResult = PyDict_GetItemString(pDictionary, "result" );

double result;
PyArg_Parse(pResult, "d", &result );

Py_Finalize();
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …