@@ -31,6 +31,15 @@ struct Foo {
3131using FooShPtr = Foo<0 >;
3232using FooSmHld = Foo<1 >;
3333
34+ struct Outer {
35+ std::shared_ptr<FooShPtr> ShPtr;
36+ std::shared_ptr<FooSmHld> SmHld;
37+ Outer ()
38+ : ShPtr(std::make_shared<FooShPtr>(" Outer" )), SmHld(std::make_shared<FooSmHld>(" Outer" )) {}
39+ std::shared_ptr<FooShPtr> getShPtr () const { return ShPtr; }
40+ std::shared_ptr<FooSmHld> getSmHld () const { return SmHld; }
41+ };
42+
3443} // namespace
3544} // namespace pybind11_tests
3645
@@ -48,6 +57,32 @@ TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) {
4857 .def (" get_history" , &FooShPtr::get_history);
4958 py::classh<FooSmHld>(m, " FooSmHld" ).def (" get_history" , &FooSmHld::get_history);
5059
60+ auto outer = py::class_<Outer>(m, " Outer" ).def (py::init ());
61+ #define MAKE_PROP (PropTyp ) \
62+ MAKE_PROP_FOO (ShPtr, PropTyp) \
63+ MAKE_PROP_FOO (SmHld, PropTyp)
64+
65+ #define MAKE_PROP_FOO (FooTyp, PropTyp ) \
66+ .def_ ##PropTyp (#FooTyp " _" #PropTyp " _default" , &Outer::FooTyp) \
67+ .def_ ##PropTyp ( \
68+ #FooTyp " _" #PropTyp " _copy" , &Outer::FooTyp, py::return_value_policy::copy) \
69+ .def_ ##PropTyp ( \
70+ #FooTyp " _" #PropTyp " _move" , &Outer::FooTyp, py::return_value_policy::move)
71+ outer MAKE_PROP (readonly) MAKE_PROP (readwrite);
72+ #undef MAKE_PROP_FOO
73+
74+ #define MAKE_PROP_FOO (FooTyp, PropTyp ) \
75+ .def_ ##PropTyp (#FooTyp " _property_" #PropTyp " _default" , &Outer::FooTyp) \
76+ .def_property_ ##PropTyp (#FooTyp " _property_" #PropTyp " _copy" , \
77+ &Outer::get##FooTyp, \
78+ py::return_value_policy::copy) \
79+ .def_property_ ##PropTyp (#FooTyp " _property_" #PropTyp " _move" , \
80+ &Outer::get##FooTyp, \
81+ py::return_value_policy::move)
82+ outer MAKE_PROP (readonly);
83+ #undef MAKE_PROP_FOO
84+ #undef MAKE_PROP
85+
5186 m.def (" test_ShPtr_copy" , []() {
5287 auto o = std::make_shared<FooShPtr>(" copy" );
5388 auto l = py::list ();
0 commit comments