You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							163 lines
						
					
					
						
							11 KiB
						
					
					
				| 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::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::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`      | | |
| +------------------------------------+---------------------------+-------------------------------+
 |