python - Pybind - 使用指向派生类的共享指针调用函数

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

我有以下设置(1 个基类、1 个派生类、1 个容器)。容器采用 shared_ptr<Base>作为输入。

#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);
}

在 C++ 中,我可以传递 shared_ptr<Base>shared_ptr<Derived>input功能。但是在 Python 中我得到一个错误:

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>

我试过玩类似的东西

.def("input", py::overload_cast<const std::shared_ptr<Derived>&> (&Container::input))
.def("input", [](const std::shared_ptr<Derived> & ptr) { this->input(ptr); })

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

我使用 Windows 10 和 Python 3.6 x64,并使用 VS 2019 编译所有内容。

最佳答案

作为@n.m.建议:

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

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

关于python - Pybind - 使用指向派生类的共享指针调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827899/

相关文章:

python - 从 Python 中捕获音频

python - 将多个参数传递给函数的最有效方法?

c++ - MPI 双环、最大值、最小值和平均值

python-3.x - 无法使用 Selenium/Splinter 保存和重新加载 Gmail Cookie

python - Cython 中有哪些类型可用?

python - 使 turtle 图形内联

python - 导入错误: No module named shutil_get_terminal_size

python - 网站在浏览器中打开,但在 Python 中打开时返回 403

c++ - ZMQ C++ Req 到路由器问题

c++ - 重载小于不同类型的运算符