auto_ptr con swig

Estoy tratando de envolver una biblioteca de C ++ que usa auto_ptr. Estoy usando swig y quiero generar enlaces de python. He visto la sección del documento de swig sobre cómo usar swig con punteros inteligentes aquí . Pero no puedo hacerlo funcionar.

Swig genera código que quiere inicializar auto_ptr usando una referencia constante, pero auto_ptr define el constructor de copia con una referencia no constante, por ejemplo, auto_ptr (auto_ptr &). El código generado no se comstack con “descarta los calificadores const.” Cuando elimino manualmente el calificador const, el código se comstack bien.

He visto muchas entradas de listas de correo, pero nada ayudó. Alguien me puede dar un ejemplo de trabajo. Mi muestra no de trabajo está aquí:

%module auto_ptr_test %{ #include  #include  using namespace std; %} namespace std { template  class auto_ptr { auto_ptr(); auto_ptr(auto_ptr &); T *operator->() const; }; } %inline %{ class Test { Test() { cout << "Test()" << endl; } public: static std::auto_ptr create() const { return auto_ptr(new Test()); } void greet() { cout << "hello" << endl; } }; %} %template () std::auto_ptr; 

Lo compilé usando cmake con el siguiente CMakeLists.txt:

 cmake_minimum_required(VERSION 2.8) find_package(SWIG REQUIRED) include(${SWIG_USE_FILE}) FIND_PACKAGE(PythonLibs) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(CMAKE_SWIG_FLAGS "") SET_SOURCE_FILES_PROPERTIES(auto_ptr_test.i PROPERTIES CPLUSPLUS ON) SWIG_ADD_MODULE(auto_ptr_test python auto_ptr_test.i) SWIG_LINK_LIBRARIES(auto_ptr_test ${PYTHON_LIBRARIES}) 

Encontré una pista sobre cómo hacerlo en libRETS, y necesitas hacerlo por cada método:

http://code.crt.realtors.org/projects/librets/browser/librets/trunk/project/swig/auto_ptr_release.i?rev=HEAD

Básicamente, desea desenvolver auto_ptr que recibe de C ++ y envolverlo antes de pasar a C ++. Ejemplo de código para poner en el archivo .i es:

  //original prototype: //virtual void SetSomething(std::auto_ptr value) = 0; //replacement to be generated by SWIG: %extend{ void SetSomething(ValueClass *value){ std::auto_ptr tmp(value); $self->SetSomething(tmp); } } //retrieving object wrapped in auto_ptr using swig macro: %define SWIG_RELEASE_AUTO_PTR(RETURN_TYPE, METHOD_NAME, PROTO, ARGS) %extend { RETURN_TYPE * METHOD_NAME PROTO { std::auto_ptr auto_result = self->METHOD_NAME ARGS; return auto_result.release(); } } %enddef // and then inside class: // virtual auto_ptr SomeMethod(const string& foo) = 0; // replaced with: SWIG_RELEASE_AUTO_PTR(ValueClass,SomeMethod,(const string& foo),(foo)); 

No creo que vaya a poder envolver este código con éxito en SWIG. El problema es que auto_ptr cambia la propiedad cuando se copia. Es por esto que requiere que el constructor de copia no tenga const. La forma en que SWIG administra la propiedad de los objetos internamente significa que es poco probable que obtenga el comportamiento de propiedad deseado sin una gran cantidad de código SWIG personalizado.