stl.rst revision 12391:ceeca8b41e4b
1STL containers
2##############
3
4Automatic conversion
5====================
6
7When including the additional header file :file:`pybind11/stl.h`, conversions
8between ``std::vector<>``/``std::list<>``/``std::array<>``,
9``std::set<>``/``std::unordered_set<>``, and
10``std::map<>``/``std::unordered_map<>`` and the Python ``list``, ``set`` and
11``dict`` data structures are automatically enabled. The types ``std::pair<>``
12and ``std::tuple<>`` are already supported out of the box with just the core
13:file:`pybind11/pybind11.h` header.
14
15The major downside of these implicit conversions is that containers must be
16converted (i.e. copied) on every Python->C++ and C++->Python transition, which
17can have implications on the program semantics and performance. Please read the
18next sections for more details and alternative approaches that avoid this.
19
20.. note::
21
22    Arbitrary nesting of any of these types is possible.
23
24.. seealso::
25
26    The file :file:`tests/test_stl.cpp` contains a complete
27    example that demonstrates how to pass STL data types in more detail.
28
29.. _cpp17_container_casters:
30
31C++17 library containers
32========================
33
34The :file:`pybind11/stl.h` header also includes support for ``std::optional<>``
35and ``std::variant<>``. These require a C++17 compiler and standard library.
36In C++14 mode, ``std::experimental::optional<>`` is supported if available.
37
38Various versions of these containers also exist for C++11 (e.g. in Boost).
39pybind11 provides an easy way to specialize the ``type_caster`` for such
40types:
41
42.. code-block:: cpp
43
44    // `boost::optional` as an example -- can be any `std::optional`-like container
45    namespace pybind11 { namespace detail {
46        template <typename T>
47        struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {};
48    }}
49
50The above should be placed in a header file and included in all translation units
51where automatic conversion is needed. Similarly, a specialization can be provided
52for custom variant types:
53
54.. code-block:: cpp
55
56    // `boost::variant` as an example -- can be any `std::variant`-like container
57    namespace pybind11 { namespace detail {
58        template <typename... Ts>
59        struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {};
60
61        // Specifies the function used to visit the variant -- `apply_visitor` instead of `visit`
62        template <>
63        struct visit_helper<boost::variant> {
64            template <typename... Args>
65            static auto call(Args &&...args) -> decltype(boost::apply_visitor(args...)) {
66                return boost::apply_visitor(args...);
67            }
68        };
69    }} // namespace pybind11::detail
70
71The ``visit_helper`` specialization is not required if your ``name::variant`` provides
72a ``name::visit()`` function. For any other function name, the specialization must be
73included to tell pybind11 how to visit the variant.
74
75.. note::
76
77    pybind11 only supports the modern implementation of ``boost::variant``
78    which makes use of variadic templates. This requires Boost 1.56 or newer.
79    Additionally, on Windows, MSVC 2017 is required because ``boost::variant``
80    falls back to the old non-variadic implementation on MSVC 2015.
81
82.. _opaque:
83
84Making opaque types
85===================
86
87pybind11 heavily relies on a template matching mechanism to convert parameters
88and return values that are constructed from STL data types such as vectors,
89linked lists, hash tables, etc. This even works in a recursive manner, for
90instance to deal with lists of hash maps of pairs of elementary and custom
91types, etc.
92
93However, a fundamental limitation of this approach is that internal conversions
94between Python and C++ types involve a copy operation that prevents
95pass-by-reference semantics. What does this mean?
96
97Suppose we bind the following function
98
99.. code-block:: cpp
100
101    void append_1(std::vector<int> &v) {
102       v.push_back(1);
103    }
104
105and call it from Python, the following happens:
106
107.. code-block:: pycon
108
109   >>> v = [5, 6]
110   >>> append_1(v)
111   >>> print(v)
112   [5, 6]
113
114As you can see, when passing STL data structures by reference, modifications
115are not propagated back the Python side. A similar situation arises when
116exposing STL data structures using the ``def_readwrite`` or ``def_readonly``
117functions:
118
119.. code-block:: cpp
120
121    /* ... definition ... */
122
123    class MyClass {
124        std::vector<int> contents;
125    };
126
127    /* ... binding code ... */
128
129    py::class_<MyClass>(m, "MyClass")
130        .def(py::init<>())
131        .def_readwrite("contents", &MyClass::contents);
132
133In this case, properties can be read and written in their entirety. However, an
134``append`` operation involving such a list type has no effect:
135
136.. code-block:: pycon
137
138   >>> m = MyClass()
139   >>> m.contents = [5, 6]
140   >>> print(m.contents)
141   [5, 6]
142   >>> m.contents.append(7)
143   >>> print(m.contents)
144   [5, 6]
145
146Finally, the involved copy operations can be costly when dealing with very
147large lists. To deal with all of the above situations, pybind11 provides a
148macro named ``PYBIND11_MAKE_OPAQUE(T)`` that disables the template-based
149conversion machinery of types, thus rendering them *opaque*. The contents of
150opaque objects are never inspected or extracted, hence they *can* be passed by
151reference. For instance, to turn ``std::vector<int>`` into an opaque type, add
152the declaration
153
154.. code-block:: cpp
155
156    PYBIND11_MAKE_OPAQUE(std::vector<int>);
157
158before any binding code (e.g. invocations to ``class_::def()``, etc.). This
159macro must be specified at the top level (and outside of any namespaces), since
160it instantiates a partial template overload. If your binding code consists of
161multiple compilation units, it must be present in every file (typically via a
162common header) preceding any usage of ``std::vector<int>``. Opaque types must
163also have a corresponding ``class_`` declaration to associate them with a name
164in Python, and to define a set of available operations, e.g.:
165
166.. code-block:: cpp
167
168    py::class_<std::vector<int>>(m, "IntVector")
169        .def(py::init<>())
170        .def("clear", &std::vector<int>::clear)
171        .def("pop_back", &std::vector<int>::pop_back)
172        .def("__len__", [](const std::vector<int> &v) { return v.size(); })
173        .def("__iter__", [](std::vector<int> &v) {
174           return py::make_iterator(v.begin(), v.end());
175        }, py::keep_alive<0, 1>()) /* Keep vector alive while iterator is used */
176        // ....
177
178Please take a look at the :ref:`macro_notes` before using the
179``PYBIND11_MAKE_OPAQUE`` macro.
180
181.. seealso::
182
183    The file :file:`tests/test_opaque_types.cpp` contains a complete
184    example that demonstrates how to create and expose opaque types using
185    pybind11 in more detail.
186
187.. _stl_bind:
188
189Binding STL containers
190======================
191
192The ability to expose STL containers as native Python objects is a fairly
193common request, hence pybind11 also provides an optional header file named
194:file:`pybind11/stl_bind.h` that does exactly this. The mapped containers try
195to match the behavior of their native Python counterparts as much as possible.
196
197The following example showcases usage of :file:`pybind11/stl_bind.h`:
198
199.. code-block:: cpp
200
201    // Don't forget this
202    #include <pybind11/stl_bind.h>
203
204    PYBIND11_MAKE_OPAQUE(std::vector<int>);
205    PYBIND11_MAKE_OPAQUE(std::map<std::string, double>);
206
207    // ...
208
209    // later in binding code:
210    py::bind_vector<std::vector<int>>(m, "VectorInt");
211    py::bind_map<std::map<std::string, double>>(m, "MapStringDouble");
212
213When binding STL containers pybind11 considers the types of the container's
214elements to decide whether the container should be confined to the local module
215(via the :ref:`module_local` feature).  If the container element types are
216anything other than already-bound custom types bound without
217``py::module_local()`` the container binding will have ``py::module_local()``
218applied.  This includes converting types such as numeric types, strings, Eigen
219types; and types that have not yet been bound at the time of the stl container
220binding.  This module-local binding is designed to avoid potential conflicts
221between module bindings (for example, from two separate modules each attempting
222to bind ``std::vector<int>`` as a python type).
223
224It is possible to override this behavior to force a definition to be either
225module-local or global.  To do so, you can pass the attributes
226``py::module_local()`` (to make the binding module-local) or
227``py::module_local(false)`` (to make the binding global) into the
228``py::bind_vector`` or ``py::bind_map`` arguments:
229
230.. code-block:: cpp
231
232    py::bind_vector<std::vector<int>>(m, "VectorInt", py::module_local(false));
233
234Note, however, that such a global binding would make it impossible to load this
235module at the same time as any other pybind module that also attempts to bind
236the same container type (``std::vector<int>`` in the above example).
237
238See :ref:`module_local` for more details on module-local bindings.
239
240.. seealso::
241
242    The file :file:`tests/test_stl_binders.cpp` shows how to use the
243    convenience STL container wrappers.
244