| 
									
										
										
										
											2020-09-17 06:03:25 +08:00
										 |  |  | .. _type-conversions:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-18 02:44:43 +08:00
										 |  |  | Type conversions
 | 
					
						
							|  |  |  | ################
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Apart from enabling cross-language function calls, a fundamental problem
 | 
					
						
							|  |  |  | that a binding tool like pybind11 must address is to provide access to
 | 
					
						
							|  |  |  | native Python types in C++ and vice versa. There are three fundamentally
 | 
					
						
							|  |  |  | different ways to do this—which approach is preferable for a particular type
 | 
					
						
							|  |  |  | depends on the situation at hand.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1. Use a native C++ type everywhere. In this case, the type must be wrapped
 | 
					
						
							|  |  |  |    using pybind11-generated bindings so that Python can interact with it.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 2. Use a native Python type everywhere. It will need to be wrapped so that
 | 
					
						
							|  |  |  |    C++ functions can interact with it.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 3. Use a native C++ type on the C++ side and a native Python type on the
 | 
					
						
							|  |  |  |    Python side. pybind11 refers to this as a *type conversion*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Type conversions are the most "natural" option in the sense that native
 | 
					
						
							|  |  |  |    (non-wrapped) types are used everywhere. The main downside is that a copy
 | 
					
						
							|  |  |  |    of the data must be made on every Python ↔ C++ transition: this is
 | 
					
						
							|  |  |  |    needed since the C++ and Python versions of the same type generally won't
 | 
					
						
							|  |  |  |    have the same memory layout.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    pybind11 can perform many kinds of conversions automatically. An overview
 | 
					
						
							|  |  |  |    is provided in the table ":ref:`conversion_table`".
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The following subsections discuss the differences between these options in more
 | 
					
						
							|  |  |  | detail. The main focus in this section is on type conversions, which represent
 | 
					
						
							|  |  |  | the last case of the above list.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. toctree::
 | 
					
						
							|  |  |  |    :maxdepth: 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    overview
 | 
					
						
							|  |  |  |    strings
 | 
					
						
							|  |  |  |    stl
 | 
					
						
							|  |  |  |    functional
 | 
					
						
							|  |  |  |    chrono
 | 
					
						
							|  |  |  |    eigen
 | 
					
						
							|  |  |  |    custom
 |