Можно ли маризовать пользовательские данные в нанобинд?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли маризовать пользовательские данные в нанобинд?

Сообщение Anonymous »

У меня есть класс A с классом B членом данных в C ++, который я выставляю через Nanobind :: Class _ . Я внедряю __getState __ и __setstate __ для обоих, и я хотел бы, чтобы состояние выглядело что -то вроде std :: make_tuple (...) .
Я попытался раскрыть его через 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 
напрямую (не в NB :: Capsule ) приводит к тому, что объект игнорируется как объект, подлежащий питону (не называется __getState __ и __SetState __ ) при попытке мариовать и многообразовать «/p>
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»