Если вы можете немного изменить свои структуры, go для std::array
, поскольку pybind11 поддерживает контейнеры STL, но не для необработанных массивов.
struct ModA{
int a;
std::array<float, 10> b;
};
struct ModB{
int c;
std::array<ModA, 5> d;
};
PYBIND11_MODULE(xxx, m) {
py::class_<ModA>(m, "ModA")
.def(py::init<>())
.def_readwrite("a", &ModA::a)
.def_readwrite("b", &ModA::b);
py::class_<ModB>(m, "ModB")
.def(py::init<>())
.def_readwrite("c", &ModB::c)
.def_readwrite("d", &ModB::d);
}
Это решение позволяет получить доступ поля a
, b
, c
, d
в режиме чтения / записи в python, однако изменить std::array
отдельный элемент невозможно, вам нужно изменить целый массив сразу.
Если по какой-то причине вам абсолютно необходимо сохранить свои структуры нетронутыми, вы можете попытаться обернуть их в классы C ++ следующим образом:
struct A{
int a;
float b[10];
};
class MyA
{
public:
// + maybe some constructor accepting struct A
int getInt() { return a_.a; }
void setInt(int n) { a_.a = n; }
std::array<float, 10> getArr() {
std::array<float, 10> result;
std::memcpy(result.data(), a_.b, 10*sizeof(float));
return result;
}
void setArr(const std::array<float, 10>& arr) {
std::memcpy(a_.b, arr.data(), 10*sizeof(float));
}
void setArrIdx(float val, size_t idx) { a_.b[idx] = val; }
private:
A a_;
};
PYBIND11_MODULE(xxx, m) {
py::class_<MyA>(m, "MyA")
.def(py::init<>())
.def("getInt", &MyA::getInt)
.def("setInt", &MyA::setInt)
.def("getArr", &MyA::getArr)
.def("setArr", &MyA::setArr)
.def("setArrIdx", &MyA::setArrIdx);
}
Однако обратите внимание, что с class MyB
он получает более сложным, потому что вам нужно реализовать операции для преобразования вашего исходного struct A
в новый class MyA
каждый раз, когда вы получаете доступ к контейнеру class MyA
внутри вашего class MyB
. Я бы не стал go таким образом, если бы это не было абсолютно необходимо.
Что касается использования ваших структур в функциях pythoni c, проблем нет, просто используйте их как любую другую переменную pythoni c:
import xxx
var = xxx.ModB()
def foo(x):
print(x.d)
x.c = 69
return x
var = foo(var)
print(var.c)