Как связать неявный конструктор/преобразование в Python с помощью pybind11?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как связать неявный конструктор/преобразование в Python с помощью pybind11?

Сообщение Anonymous »

Я пытаюсь имитировать неявное преобразование/создание простой структуры в Python с помощью pybind11:

Код: Выделить всё

struct MyType {
double a;
double b;
};

void func(size_t foo, const MyType& bar) {
// ...
}

// ...

PYBIND11_MODULE(pymylib, module) {
// ...
py::class_< MyType >(module, "MyType")
.def(py::init< double, double >(), "a"_a, "b"_a)
.def(py::init([](const std::array< double, 2 >& ab){ return MyType({ab[0], ab[1]}); }), "ab"_a = std::array< double, 2>{ 1.0, 0.25 })   // not implicit
.def_readwrite("a", &MyType::a)
.def_readwrite("b", &MyType::b);

py::implicitly_convertible< std::array< double, 2 >, MyType >();   // conversion is not implicit

module.def("func", &func, "foo"_a, "bar"_a);
}
Хотя в C++ можно использовать инициализацию фигурных скобок { без необходимости неявного вызова конструктора MyType (упрощая синтаксис), я по-прежнему не могу иметь неявный преобразование из объекта списка при передаче MyType в качестве аргумента функции func:

Код: Выделить всё

obj = module.MyType(8.7, 5.6)

module.func(47, obj)                        # works
module.func(47, module.MyType([4.1, 7.8]))  # works
module.func(47, [4.1, 7.8])                 # does not work ('incompatible function arguments')
Насколько я понимаю из документации pybind11, объявление конструктора py::init< double, double >() должно неявно связывать инициализацию фигурных скобок, но это не работает так, как я ожидал. Я попытался добавить собственный конструктор, принимающий список/массив, но он по-прежнему не вызывается неявно.
Из-за простоты структуры необходимость явного вызова конструктора кажется ненужной, особенно если определено в подмодуле Python или вложено в другой класс;
Как, если возможно, добиться такого поведения в Python?

Подробнее здесь: https://stackoverflow.com/questions/781 ... h-pybind11
Ответить

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

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

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

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

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