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.
		
		
		
		
		
			
		
			
				
					
					
						
							98 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							98 lines
						
					
					
						
							2.8 KiB
						
					
					
				
								/*
							 | 
						|
								    example/example12.cpp -- overriding virtual functions from Python
							 | 
						|
								
							 | 
						|
								    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
							 | 
						|
								
							 | 
						|
								    All rights reserved. Use of this source code is governed by a
							 | 
						|
								    BSD-style license that can be found in the LICENSE file.
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								#include "example.h"
							 | 
						|
								#include <pybind11/functional.h>
							 | 
						|
								
							 | 
						|
								/* This is an example class that we'll want to be able to extend from Python */
							 | 
						|
								class Example12  {
							 | 
						|
								public:
							 | 
						|
								    Example12(int state) : state(state) {
							 | 
						|
								        cout << "Constructing Example12.." << endl;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    ~Example12() {
							 | 
						|
								        cout << "Destructing Example12.." << endl;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    virtual int run(int value) {
							 | 
						|
								        std::cout << "Original implementation of Example12::run(state=" << state
							 | 
						|
								                  << ", value=" << value << ")" << std::endl;
							 | 
						|
								        return state + value;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    virtual bool run_bool() = 0;
							 | 
						|
								    virtual void pure_virtual() = 0;
							 | 
						|
								private:
							 | 
						|
								    int state;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								/* This is a wrapper class that must be generated */
							 | 
						|
								class PyExample12 : public Example12 {
							 | 
						|
								public:
							 | 
						|
								    using Example12::Example12; /* Inherit constructors */
							 | 
						|
								
							 | 
						|
								    virtual int run(int value) {
							 | 
						|
								        /* Generate wrapping code that enables native function overloading */
							 | 
						|
								        PYBIND11_OVERLOAD(
							 | 
						|
								            int,        /* Return type */
							 | 
						|
								            Example12,  /* Parent class */
							 | 
						|
								            run,        /* Name of function */
							 | 
						|
								            value       /* Argument(s) */
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    virtual bool run_bool() {
							 | 
						|
								        PYBIND11_OVERLOAD_PURE(
							 | 
						|
								            bool,
							 | 
						|
								            Example12,
							 | 
						|
								            run_bool
							 | 
						|
								        );
							 | 
						|
								        throw std::runtime_error("this will never be reached");
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    virtual void pure_virtual() {
							 | 
						|
								        PYBIND11_OVERLOAD_PURE(
							 | 
						|
								            void,         /* Return type */
							 | 
						|
								            Example12,    /* Parent class */
							 | 
						|
								            pure_virtual  /* Name of function */
							 | 
						|
								                          /* This function has no arguments */
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								int runExample12(Example12 *ex, int value) {
							 | 
						|
								    return ex->run(value);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								bool runExample12Bool(Example12* ex) {
							 | 
						|
								    return ex->run_bool();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void runExample12Virtual(Example12 *ex) {
							 | 
						|
								    ex->pure_virtual();
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void init_ex12(py::module &m) {
							 | 
						|
								    /* Important: use the wrapper type as a template
							 | 
						|
								       argument to class_<>, but use the original name
							 | 
						|
								       to denote the type */
							 | 
						|
								    py::class_<PyExample12>(m, "Example12")
							 | 
						|
								        /* Declare that 'PyExample12' is really an alias for the original type 'Example12' */
							 | 
						|
								        .alias<Example12>()
							 | 
						|
								        .def(py::init<int>())
							 | 
						|
								        /* Reference original class in function definitions */
							 | 
						|
								        .def("run", &Example12::run)
							 | 
						|
								        .def("run_bool", &Example12::run_bool)
							 | 
						|
								        .def("pure_virtual", &Example12::pure_virtual);
							 | 
						|
								
							 | 
						|
								    m.def("runExample12", &runExample12);
							 | 
						|
								    m.def("runExample12Bool", &runExample12Bool);
							 | 
						|
								    m.def("runExample12Virtual", &runExample12Virtual);
							 | 
						|
								}
							 |