2

auto_ptr を使用する C++ ライブラリをラップしようとしています。私は swig を使用しており、Python バインディングを生成したいと考えています。ここで、swig をスマート ポインターで使用する方法に関する swig ドキュメントのセクションを見てきました。しかし、私はそれを機能させることができません。

Swig は const 参照を使用して auto_ptr を初期化するコードを生成しますが、auto_ptr は auto_ptr(auto_ptr &) などの非 const 参照を使用してコピー コンストラクターを定義します。生成されたコードは、"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>;

次の CMakeLists.txt で cmake を使用してコンパイルしました。

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})
4

2 に答える 2

1

このコードをSWIGで正常にラップできるとは思いません。問題は、auto_ptrがコピー時に所有権を変更することです。これが、コピーコンストラクタがconstを持たないようにする必要がある理由です。SWIGがオブジェクトの所有権を内部で管理する方法は、多くのカスタムSWIGコードがないと、目的の所有権の動作が得られない可能性が高いことを意味します。

于 2011-03-11T14:31:38.403 に答える