172 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
| 
								 | 
							
								Overview
							 | 
						||
| 
								 | 
							
								########
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. rubric:: 1. Native type in C++, wrapper in Python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Exposing a custom C++ type using :class:`py::class_` was covered in detail
							 | 
						||
| 
								 | 
							
								in the :doc:`/classes` section. There, the underlying data structure is
							 | 
						||
| 
								 | 
							
								always the original C++ class while the :class:`py::class_` wrapper provides
							 | 
						||
| 
								 | 
							
								a Python interface. Internally, when an object like this is sent from C++ to
							 | 
						||
| 
								 | 
							
								Python, pybind11 will just add the outer wrapper layer over the native C++
							 | 
						||
| 
								 | 
							
								object. Getting it back from Python is just a matter of peeling off the
							 | 
						||
| 
								 | 
							
								wrapper.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. rubric:: 2. Wrapper in C++, native type in Python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This is the exact opposite situation. Now, we have a type which is native to
							 | 
						||
| 
								 | 
							
								Python, like a ``tuple`` or a ``list``. One way to get this data into C++ is
							 | 
						||
| 
								 | 
							
								with the :class:`py::object` family of wrappers. These are explained in more
							 | 
						||
| 
								 | 
							
								detail in the :doc:`/advanced/pycpp/object` section. We'll just give a quick
							 | 
						||
| 
								 | 
							
								example here:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: cpp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void print_list(py::list my_list) {
							 | 
						||
| 
								 | 
							
								        for (auto item : my_list)
							 | 
						||
| 
								 | 
							
								            std::cout << item << " ";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: pycon
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    >>> print_list([1, 2, 3])
							 | 
						||
| 
								 | 
							
								    1 2 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The Python ``list`` is not converted in any way -- it's just wrapped in a C++
							 | 
						||
| 
								 | 
							
								:class:`py::list` class. At its core it's still a Python object. Copying a
							 | 
						||
| 
								 | 
							
								:class:`py::list` will do the usual reference-counting like in Python.
							 | 
						||
| 
								 | 
							
								Returning the object to Python will just remove the thin wrapper.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. rubric:: 3. Converting between native C++ and Python types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In the previous two cases we had a native type in one language and a wrapper in
							 | 
						||
| 
								 | 
							
								the other. Now, we have native types on both sides and we convert between them.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: cpp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void print_vector(const std::vector<int> &v) {
							 | 
						||
| 
								 | 
							
								        for (auto item : v)
							 | 
						||
| 
								 | 
							
								            std::cout << item << "\n";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: pycon
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    >>> print_vector([1, 2, 3])
							 | 
						||
| 
								 | 
							
								    1 2 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In this case, pybind11 will construct a new ``std::vector<int>`` and copy each
							 | 
						||
| 
								 | 
							
								element from the Python ``list``. The newly constructed object will be passed
							 | 
						||
| 
								 | 
							
								to ``print_vector``. The same thing happens in the other direction: a new
							 | 
						||
| 
								 | 
							
								``list`` is made to match the value returned from C++.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Lots of these conversions are supported out of the box, as shown in the table
							 | 
						||
| 
								 | 
							
								below. They are very convenient, but keep in mind that these conversions are
							 | 
						||
| 
								 | 
							
								fundamentally based on copying data. This is perfectly fine for small immutable
							 | 
						||
| 
								 | 
							
								types but it may become quite expensive for large data structures. This can be
							 | 
						||
| 
								 | 
							
								avoided by overriding the automatic conversion with a custom wrapper (i.e. the
							 | 
						||
| 
								 | 
							
								above-mentioned approach 1). This requires some manual effort and more details
							 | 
						||
| 
								 | 
							
								are available in the :ref:`opaque` section.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. _conversion_table:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								List of all builtin conversions
							 | 
						||
| 
								 | 
							
								-------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following basic data types are supported out of the box (some may require
							 | 
						||
| 
								 | 
							
								an additional extension header to be included). To pass other data structures
							 | 
						||
| 
								 | 
							
								as arguments and return values, refer to the section on binding :ref:`classes`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								|  Data type                         |  Description              | Header file                       |
							 | 
						||
| 
								 | 
							
								+====================================+===========================+===================================+
							 | 
						||
| 
								 | 
							
								| ``int8_t``, ``uint8_t``            | 8-bit integers            | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``int16_t``, ``uint16_t``          | 16-bit integers           | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``int32_t``, ``uint32_t``          | 32-bit integers           | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``int64_t``, ``uint64_t``          | 64-bit integers           | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``ssize_t``, ``size_t``            | Platform-dependent size   | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``float``, ``double``              | Floating point types      | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``bool``                           | Two-state Boolean type    | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``char``                           | Character literal         | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``char16_t``                       | UTF-16 character literal  | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``char32_t``                       | UTF-32 character literal  | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``wchar_t``                        | Wide character literal    | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``const char *``                   | UTF-8 string literal      | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``const char16_t *``               | UTF-16 string literal     | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``const char32_t *``               | UTF-32 string literal     | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``const wchar_t *``                | Wide string literal       | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::string``                    | STL dynamic UTF-8 string  | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::u16string``                 | STL dynamic UTF-16 string | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::u32string``                 | STL dynamic UTF-32 string | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::wstring``                   | STL dynamic wide string   | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::string_view``,              | STL C++17 string views    | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								| ``std::u16string_view``, etc.      |                           |                                   |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::pair<T1, T2>``              | Pair of two custom types  | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::tuple<...>``                | Arbitrary tuple of types  | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::reference_wrapper<...>``    | Reference type wrapper    | :file:`pybind11/pybind11.h`       |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::complex<T>``                | Complex numbers           | :file:`pybind11/complex.h`        |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::array<T, Size>``            | STL static array          | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::vector<T>``                 | STL dynamic array         | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::deque<T>``                  | STL double-ended queue    | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::valarray<T>``               | STL value array           | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::list<T>``                   | STL linked list           | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::map<T1, T2>``               | STL ordered map           | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::unordered_map<T1, T2>``     | STL unordered map         | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::set<T>``                    | STL ordered set           | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::unordered_set<T>``          | STL unordered set         | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::optional<T>``               | STL optional type (C++17) | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::experimental::optional<T>`` | STL optional type (exp.)  | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::variant<...>``              | Type-safe union (C++17)   | :file:`pybind11/stl.h`            |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::filesystem::path<T>``       | STL path (C++17) [#]_     | :file:`pybind11/stl/filesystem.h` |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::function<...>``             | STL polymorphic function  | :file:`pybind11/functional.h`     |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::chrono::duration<...>``     | STL time duration         | :file:`pybind11/chrono.h`         |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``std::chrono::time_point<...>``   | STL date/time             | :file:`pybind11/chrono.h`         |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``Eigen::Matrix<...>``             | Eigen: dense matrix       | :file:`pybind11/eigen.h`          |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``Eigen::Map<...>``                | Eigen: mapped memory      | :file:`pybind11/eigen.h`          |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								| ``Eigen::SparseMatrix<...>``       | Eigen: sparse matrix      | :file:`pybind11/eigen.h`          |
							 | 
						||
| 
								 | 
							
								+------------------------------------+---------------------------+-----------------------------------+
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. [#] ``std::filesystem::path`` is converted to ``pathlib.Path`` and
							 | 
						||
| 
								 | 
							
								   ``os.PathLike`` is converted to ``std::filesystem::path``, but this requires
							 | 
						||
| 
								 | 
							
								   Python 3.6 (for ``__fspath__`` support).
							 |