#include "pybind11_tests.h" #include namespace pybind11_tests { namespace class_sh_trampoline_basic { struct Abase { int val = 0; virtual ~Abase() = default; explicit Abase(int val_) : val{val_} {} int Get() const { return val * 10 + 3; } virtual int Add(int other_val) const = 0; // Some compilers complain about implicitly defined versions of some of the following: Abase(const Abase &) = default; Abase(Abase &&) noexcept = default; Abase &operator=(const Abase &) = default; Abase &operator=(Abase &&) noexcept = default; }; struct AbaseAlias : Abase, py::trampoline_self_life_support { using Abase::Abase; int Add(int other_val) const override { PYBIND11_OVERRIDE_PURE(int, /* Return type */ Abase, /* Parent class */ Add, /* Name of function in C++ (must match Python name) */ other_val); } }; int AddInCppRawPtr(const Abase *obj, int other_val) { return obj->Add(other_val) * 10 + 7; } int AddInCppSharedPtr(const std::shared_ptr &obj, int other_val) { return obj->Add(other_val) * 100 + 11; } int AddInCppUniquePtr(std::unique_ptr obj, int other_val) { return obj->Add(other_val) * 100 + 13; } } // namespace class_sh_trampoline_basic } // namespace pybind11_tests using namespace pybind11_tests::class_sh_trampoline_basic; TEST_SUBMODULE(class_sh_trampoline_basic, m) { py::classh(m, "Abase") .def(py::init(), py::arg("val")) .def("Get", &Abase::Get) .def("Add", &Abase::Add, py::arg("other_val")); m.def("AddInCppRawPtr", AddInCppRawPtr, py::arg("obj"), py::arg("other_val")); m.def("AddInCppSharedPtr", AddInCppSharedPtr, py::arg("obj"), py::arg("other_val")); m.def("AddInCppUniquePtr", AddInCppUniquePtr, py::arg("obj"), py::arg("other_val")); }