@@ -98,6 +98,16 @@ class MyObject3 : public std::enable_shared_from_this<MyObject3> {
98
98
int value;
99
99
};
100
100
101
+ // an uncopyable object managed by a std::shared_ptr<>
102
+ class MyObject3a {
103
+ public:
104
+ MyObject3a (int value) : value(value) { print_created (this , toString ()); }
105
+ std::string toString () const { return " MyObject3a[" + std::to_string (value) + " ]" ; }
106
+ virtual ~MyObject3a () { print_destroyed (this ); }
107
+ private:
108
+ int value;
109
+ };
110
+
101
111
// test_unique_nodelete
102
112
// Object with a private destructor
103
113
class MyObject4 ;
@@ -353,6 +363,15 @@ TEST_SUBMODULE(smart_ptr, m) {
353
363
m.def (" print_myobject3_3" , [](const std::shared_ptr<MyObject3> &obj) { py::print (obj->toString ()); });
354
364
m.def (" print_myobject3_4" , [](const std::shared_ptr<MyObject3> *obj) { py::print ((*obj)->toString ()); });
355
365
366
+ py::class_<MyObject3a>(m, " MyObject3a" );
367
+ m.def (" make_myobject3_1" , []() { return new MyObject3a (8 ); });
368
+ m.def (" make_myobject3_2" , []() { return std::make_shared<MyObject3a>(9 ); });
369
+ m.def (" print_myobject3a_1" , [](const MyObject3a *obj) { py::print (obj->toString ()); });
370
+ m.def (" print_myobject3a_2" , [](std::shared_ptr<MyObject3a> obj) { py::print (obj->toString ()); });
371
+ m.def (" print_myobject3a_3" , [](const std::shared_ptr<MyObject3a> &obj) { py::print (obj->toString ()); });
372
+ // this doesn't compile, should it?
373
+ // m.def("print_myobject3a_4", [](const std::shared_ptr<MyObject3a> *obj) { py::print((*obj)->toString()); });
374
+
356
375
// test_smart_ptr_refcounting
357
376
m.def (" test_object1_refcounting" , []() {
358
377
ref<MyObject1> o = new MyObject1 (0 );
@@ -462,4 +481,10 @@ TEST_SUBMODULE(smart_ptr, m) {
462
481
list.append (py::cast (e));
463
482
return list;
464
483
});
484
+
485
+ m.def (" test_3011_shared_ptr" , []() {
486
+ auto o = std::make_shared<MyObject3a>(42 );
487
+ auto l = py::list ();
488
+ l.append (o);
489
+ });
465
490
}
0 commit comments