Pybind-使用共享指针调用函数到派生类

时间:2019-02-22 13:09:52

标签: python c++ python-3.x c++17 pybind11

我有以下设置(1个基类,1个派生类,1个容器)。容器将Omit<T, string>作为输入。

shared_ptr<Base>

在C ++中,我可以将#include <pybind11/pybind11.h> namespace py = pybind11; struct Base { }; struct Derived : public Base { }; struct Container { void input(const std::shared_ptr<Base>& ptr) { } }; PYBIND11_MODULE(PybindTest, m) { py::class_<Base, std::shared_ptr<Base>>(m, "Base").def(py::init<>()); py::class_<Derived, std::shared_ptr<Derived>>(m, "Derived").def(py::init<>()); py::class_<Container, std::shared_ptr<Container>>(m, "Container") .def(py::init<>()) .def("input", &Container::input); } shared_ptr<Base>传递给shared_ptr<Derived>函数。但是在Python中,我得到一个错误:

input

我尝试过类似的事情

import PybindTest as p
p.Container().input(p.Base())      # All good
p.Container().input(p.Derived())   # Throws Error

# TypeError                                 Traceback (most recent call last)
# <ipython-input-10-70fe5b9f3a41> in <module>
#       1 import PybindTest as p
#       2 p.Container().input(p.Base())
# ----> 3 p.Container().input(p.Derived())
# 
# TypeError: input(): incompatible function arguments. The following argument types are supported:
#     1. (self: PybindTest.Container, arg0: PybindTest.Base) -> None
# 
# Invoked with: <PybindTest.Container object at 0x0000022378B4FF80>, <PybindTest.Derived object at 0x0000022378B4FCE0>

但是这两个都不编译。 有什么建议吗?

我将Windows 10与Python 3.6 x64结合使用,并使用VS 2019进行编译。

1 个答案:

答案 0 :(得分:1)

@ n.m。建议:

py::class_<Derived, std::shared_ptr<Derived>, Base>(m, "Derived")
    .def(py::init<>());

来自pybind11 documentation(方法1:模板参数)