Skip to content

Added support for exposing classes with private destructors and corresponding documentation#368

Merged
wjakob merged 1 commit intopybind:masterfrom
nbelakovski:master
Aug 27, 2016
Merged

Added support for exposing classes with private destructors and corresponding documentation#368
wjakob merged 1 commit intopybind:masterfrom
nbelakovski:master

Conversation

@nbelakovski
Copy link
Contributor

This is in reference to issue #114.

template <typename T>
struct blank_deleter
{
void operator()(T * inst) {}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You may want to change this to

    void operator()(T*) {}

to avoid unused variable warning.

@wjakob wjakob merged commit 35540ea into pybind:master Aug 27, 2016
wjakob added a commit that referenced this pull request Aug 28, 2016
@wjakob
Copy link
Member

wjakob commented Aug 28, 2016

I committed a few modifications to this (renaming blank_deleter to nodelete and changing the class template into a function template). Can you double-check if it still works for you?

@nbelakovski
Copy link
Contributor Author

nbelakovski commented Aug 28, 2016

Yup, it works. Good call on changing to a function template.

jagerman added a commit to jagerman/pybind11 that referenced this pull request Sep 4, 2016
Currently pybind11 only supports std::unique_ptr<T> holders by default
(other holders can, of course, be declared using the macro).  PR pybind#368
added a `py::nodelete` that is intended to be used as:

    py::class_<Type, std::unique_ptr<Type, py::nodelete>> c("Type");

but this doesn't work out of the box.  (You could add an explicit
holder type declaration, but this doesn't appear to have been the
intention of the commit).

This commit fixes it by generalizing the unique_ptr type_caster to take
both the type and deleter as template arguments, so that *any*
unique_ptr instances are now automatically handled by pybind.  It also
adds a test to test_smart_ptr, testing both that py::nodelete (now)
works, and that the object is indeed not deleted as intended.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants