Pybind11: связывание функции с абстрактным справочным аргументомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Pybind11: связывание функции с абстрактным справочным аргументом

Сообщение Anonymous »

Я хочу связать функцию, которая принимает лямбду (

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

std::function
) как аргумент. Сама Лумбда имеет ссылку на абстрактный тип в качестве аргумента. Когда я пытаюсь вызвать функцию в Python, я получаю ошибку, потому что абстрактный тип не является копируемым. < /P>
Ниже приведен небольшой пример. У меня есть интерфейс ifoo , который является абстрактным, и ее конкретная реализация foo . Затем у меня есть функция оценки , которая принимает в качестве аргумента a std :: function .
Я бы предпочел не подвергать конкретной реализации в привязке Python, поэтому я связываю интерфейс.

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

#include 

#include
#include 

namespace py = pybind11;

class IFoo
{
public:
virtual ~IFoo() = default;
virtual void setValue(int a) = 0;
};

class Foo : public IFoo
{
public:
~Foo() override = default;

void setValue(int a) override { m_a = a; }
int getValue() const { return m_a; }
protected:
int m_a{18};
};

int evaluate(std::function&& callback)
{
Foo foo;
callback(foo);
return foo.getValue() + 34;
}

PYBIND11_MODULE(libbindtest, module)
{
py::class_< IFoo >(module, "Foo").def("setValue", &IFoo::setValue);
module.def("evaluate", &evaluate);
}

/*
int main (int, char**)
{
int res1 = evaluate([](auto& foo){ foo.setValue(22); });
int res2 = evaluate([](auto&){});
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79654689/pybind11-binding-a-function-with-an-abstract-reference-argument[/url]
Ответить

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

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

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

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

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