Код: Выделить всё
std::functionНиже приведен небольшой пример. У меня есть интерфейс 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]
Мобильная версия