auto_ptr с swig - PullRequest
       5

auto_ptr с swig

2 голосов
/ 11 октября 2010

Я пытаюсь обернуть библиотеку C ++, которая использует auto_ptr.Я использую Swig и хочу генерировать привязки Python.Я видел раздел документа swig о том, как использовать swig с умными указателями здесь .Но я не могу заставить его работать.

Swig генерирует код, который хочет инициализировать auto_ptr, используя ссылку const, но auto_ptr определяет конструктор копирования с неконстантной ссылкой, например, auto_ptr (auto_ptr &).Сгенерированный код не компилируется с "discards const qualifiers".Когда я вручную удаляю квалификатор const, код компилируется нормально.

Я видел много записей в списке рассылки, но ничего не помогло.Может ли кто-нибудь предоставить мне рабочий пример.Мой нерабочий пример здесь:

%module auto_ptr_test
%{
#include <memory>
#include <iostream>
using namespace std;
%}
namespace std {
template <class T>
class auto_ptr {
    auto_ptr();
    auto_ptr(auto_ptr &);
    T *operator->() const;
};
}

%inline %{
class Test {
Test() {
    cout << "Test()" << endl;
}
public:
static std::auto_ptr<Test> create() const {
    return auto_ptr<Test>(new Test());
}
void greet() {
    cout << "hello" << endl;
}
};
%}

%template () std::auto_ptr<Test>;

Я скомпилировал его с помощью cmake со следующим 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})

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Я нашел подсказку, как это сделать в libRETS, и вам нужно сделать это для каждого метода:

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

По сути, вы хотите развернуть auto_ptr, полученный от C ++, и обернуть его перед переходом на C ++. Пример кода для помещения в файл .i:

    //original prototype:
    //virtual void SetSomething(std::auto_ptr<ValueClass> value) = 0;
    //replacement to be generated by SWIG:
    %extend{
        void SetSomething(ValueClass *value){
            std::auto_ptr<ValueClass> 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<RETURN_TYPE> auto_result = self->METHOD_NAME ARGS;
        return auto_result.release();
    }
  }
  %enddef
  // and then inside class:
  // virtual auto_ptr<ValueClass> SomeMethod(const string& foo) = 0;
  // replaced with:
  SWIG_RELEASE_AUTO_PTR(ValueClass,SomeMethod,(const string& foo),(foo));
1 голос
/ 11 марта 2011

Я не верю, что вы сможете успешно обернуть этот код в SWIG.Проблема в том, что auto_ptr меняет владельца при копировании.Вот почему требуется, чтобы конструктор копирования не имел const.То, что SWIG управляет владением объектами внутренне, означает, что маловероятно, что вы получите желаемое поведение владения без большого количества пользовательского кода SWIG.

...