5
5
namespace pybind11_tests {
6
6
namespace class_sh_trampoline_basic {
7
7
8
- template <int SerNo> // Using int as a trick to easily generate a series of types.
9
8
struct Abase {
10
9
int val = 0 ;
11
10
virtual ~Abase () = default ;
@@ -20,63 +19,39 @@ struct Abase {
20
19
Abase &operator =(Abase &&) noexcept = default ;
21
20
};
22
21
23
- template <int SerNo>
24
- struct AbaseAlias : Abase<SerNo> {
25
- using Abase<SerNo>::Abase;
22
+ struct AbaseAlias : Abase, py::trampoline_self_life_support {
23
+ using Abase::Abase;
26
24
27
25
int Add (int other_val) const override {
28
- PYBIND11_OVERRIDE_PURE (int , /* Return type */
29
- Abase<SerNo> , /* Parent class */
30
- Add, /* Name of function in C++ (must match Python name) */
26
+ PYBIND11_OVERRIDE_PURE (int , /* Return type */
27
+ Abase, /* Parent class */
28
+ Add, /* Name of function in C++ (must match Python name) */
31
29
other_val);
32
30
}
33
31
};
34
32
35
- template <>
36
- struct AbaseAlias <1 > : Abase<1 >, py::trampoline_self_life_support {
37
- using Abase<1 >::Abase;
33
+ int AddInCppRawPtr (const Abase *obj, int other_val) { return obj->Add (other_val) * 10 + 7 ; }
38
34
39
- int Add (int other_val) const override {
40
- PYBIND11_OVERRIDE_PURE (int , /* Return type */
41
- Abase<1 >, /* Parent class */
42
- Add, /* Name of function in C++ (must match Python name) */
43
- other_val);
44
- }
45
- };
46
-
47
- template <int SerNo>
48
- int AddInCppRawPtr (const Abase<SerNo> *obj, int other_val) {
49
- return obj->Add (other_val) * 10 + 7 ;
50
- }
51
-
52
- template <int SerNo>
53
- int AddInCppSharedPtr (std::shared_ptr<Abase<SerNo>> obj, int other_val) {
35
+ int AddInCppSharedPtr (const std::shared_ptr<Abase> &obj, int other_val) {
54
36
return obj->Add (other_val) * 100 + 11 ;
55
37
}
56
38
57
- template <int SerNo>
58
- int AddInCppUniquePtr (std::unique_ptr<Abase<SerNo>> obj, int other_val) {
39
+ int AddInCppUniquePtr (std::unique_ptr<Abase> obj, int other_val) {
59
40
return obj->Add (other_val) * 100 + 13 ;
60
41
}
61
42
62
- template <int SerNo>
63
- void wrap (py::module_ m, const char *py_class_name) {
64
- py::classh<Abase<SerNo>, AbaseAlias<SerNo>>(m, py_class_name)
65
- .def (py::init<int >(), py::arg (" val" ))
66
- .def (" Get" , &Abase<SerNo>::Get)
67
- .def (" Add" , &Abase<SerNo>::Add, py::arg (" other_val" ));
68
-
69
- m.def (" AddInCppRawPtr" , AddInCppRawPtr<SerNo>, py::arg (" obj" ), py::arg (" other_val" ));
70
- m.def (" AddInCppSharedPtr" , AddInCppSharedPtr<SerNo>, py::arg (" obj" ), py::arg (" other_val" ));
71
- m.def (" AddInCppUniquePtr" , AddInCppUniquePtr<SerNo>, py::arg (" obj" ), py::arg (" other_val" ));
72
- }
73
-
74
43
} // namespace class_sh_trampoline_basic
75
44
} // namespace pybind11_tests
76
45
77
46
using namespace pybind11_tests ::class_sh_trampoline_basic;
78
47
79
48
TEST_SUBMODULE (class_sh_trampoline_basic, m) {
80
- wrap<0 >(m, " Abase0" );
81
- wrap<1 >(m, " Abase1" );
49
+ py::classh<Abase, AbaseAlias>(m, " Abase" )
50
+ .def (py::init<int >(), py::arg (" val" ))
51
+ .def (" Get" , &Abase::Get)
52
+ .def (" Add" , &Abase::Add, py::arg (" other_val" ));
53
+
54
+ m.def (" AddInCppRawPtr" , AddInCppRawPtr, py::arg (" obj" ), py::arg (" other_val" ));
55
+ m.def (" AddInCppSharedPtr" , AddInCppSharedPtr, py::arg (" obj" ), py::arg (" other_val" ));
56
+ m.def (" AddInCppUniquePtr" , AddInCppUniquePtr, py::arg (" obj" ), py::arg (" other_val" ));
82
57
}
0 commit comments