summaryrefslogtreecommitdiff
path: root/ext/pybind11/docs/advanced/smart_ptrs.rst
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pybind11/docs/advanced/smart_ptrs.rst')
-rw-r--r--ext/pybind11/docs/advanced/smart_ptrs.rst36
1 files changed, 35 insertions, 1 deletions
diff --git a/ext/pybind11/docs/advanced/smart_ptrs.rst b/ext/pybind11/docs/advanced/smart_ptrs.rst
index 23072b6bf..e4a238603 100644
--- a/ext/pybind11/docs/advanced/smart_ptrs.rst
+++ b/ext/pybind11/docs/advanced/smart_ptrs.rst
@@ -123,7 +123,7 @@ Custom smart pointers
pybind11 supports ``std::unique_ptr`` and ``std::shared_ptr`` right out of the
box. For any other custom smart pointer, transparent conversions can be enabled
using a macro invocation similar to the following. It must be declared at the
-level before any binding code:
+top namespace level before any binding code:
.. code-block:: cpp
@@ -134,8 +134,42 @@ placeholder name that is used as a template parameter of the second argument.
Thus, feel free to use any identifier, but use it consistently on both sides;
also, don't use the name of a type that already exists in your codebase.
+The macro also accepts a third optional boolean parameter that is set to false
+by default. Specify
+
+.. code-block:: cpp
+
+ PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>, true);
+
+if ``SmartPtr<T>`` can always be initialized from a ``T*`` pointer without the
+risk of inconsistencies (such as multiple independent ``SmartPtr`` instances
+believing that they are the sole owner of the ``T*`` pointer). A common
+situation where ``true`` should be passed is when the ``T`` instances use
+*intrusive* reference counting.
+
Please take a look at the :ref:`macro_notes` before using this feature.
+By default, pybind11 assumes that your custom smart pointer has a standard
+interface, i.e. provides a ``.get()`` member function to access the underlying
+raw pointer. If this is not the case, pybind11's ``holder_helper`` must be
+specialized:
+
+.. code-block:: cpp
+
+ // Always needed for custom holder types
+ PYBIND11_DECLARE_HOLDER_TYPE(T, SmartPtr<T>);
+
+ // Only needed if the type's `.get()` goes by another name
+ namespace pybind11 { namespace detail {
+ template <typename T>
+ struct holder_helper<SmartPtr<T>> { // <-- specialization
+ static const T *get(const SmartPtr<T> &p) { return p.getPointer(); }
+ };
+ }}
+
+The above specialization informs pybind11 that the custom ``SmartPtr`` class
+provides ``.get()`` functionality via ``.getPointer()``.
+
.. seealso::
The file :file:`tests/test_smart_ptr.cpp` contains a complete example