Я попытался раскрыть его через nb :: capsule , но получить ошибку BAD_CASC> .
Код: Выделить всё
#include
#include
namespace nb = nanobind;
class B {
public:
B(){};
int x = 42;
};
class A {
public:
A() {};
B b;
};
NB_MODULE(pickle_test, m) {
nb::class_(m, "B")
.def(nb::init())
.def("__getstate__", [](const B &b) {
return std::make_tuple(42);
})
.def("__setstate__", [](B &b, const std::tuple &state) {
})
;
nb::class_(m, "A")
.def(nb::init())
.def("__getstate__", [](const A &a) {
return std::make_tuple(nb::capsule(&a.b));
})
.def("__setstate__", [](A &a, const std::tuple &state) {
a.b = *(nb::cast(std::get(state)));
})
;
}
...
import sys
sys.path.append("./bin/")
import pickle_test
import pickle
c = pickle.dumps(pickle_test.B()) # works
d = pickle.dumps(pickle_test.A()) # error: cant be pickled
< /code>
Я знаю, что это всего лишь непрозрачный указатель, но есть ли способ передать сам объект? Для контекста передача B areble at aepple presect fore the presect fore the presect fore a prepection presect wyfe pre a precement presect wyfe pre a presect wipe prement wie preciте, потому что он прилагается на это Многопроцессор < /code>
Making the Cobve (но код Python в основном MVCE). Я могу получить оба b .__ getState __ и b .__ SetState __ , но, как я уже сказал, это приводит к тому, что это приводит к std :: bad_cast , потому что это просто указывает на ничего. /> Спасибо < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-nanobind
Мобильная версия