java swig中的std :: set support

时间:2015-09-28 08:57:44

标签: java c++ swig c++03

在我的java代码中,我想调用std::set默认构造函数和插入例如C ++中的以下代码:

struct foo;
foo bar();
std::set<foo> toto;
toto.insert(b);

Swig provides support for various STL containers for java,例如std::vectorstd::stringstd::map ......但是不支持std::set

所以我发现这个solution涉及一个C ++包装器和一个java包装器。我还没有尝试过,我不确定它是否会起作用,我觉得不方便。

我们可以通过提出一个处理基本集合构造函数和插入的最小swig接口来做得更好吗?

例如,接口std_set.i如:

%{
#include <set>
#include <pair>
#include <stdexcept>
%}
namespace std {
template<class T> class set {
public:
  typedef T value_type;
  set();
  pair<iterator,bool> insert(const value_type& val); // iterator might be the difficulty here
}

或者为特定模板实例化创建包装器:

%rename(SetFoo) std::set<foo>;
class std::set<foo> {
public:
    set();
    std::pair<std::set<foo>::iterator,bool> insert(const &foo val); // std::set<foo>::iterator not known here...
};

在这两种情况下,我都遇到了这个迭代器问题,无法提供“简单”的解决方案。

我试图与swig/Lib/std一起玩也暂时没有成功。

1 个答案:

答案 0 :(得分:0)

我最终决定放弃迭代器,并为我的需要提出了一个简单的包装器标题:

#include <set>

template<typename T>
struct SetWrapper {
    SetWrapper() : data() {};
    void insert(const T& val) { data.insert(val); }
    std::set<T> data;
};

然后在界面中我们可以实例化模板的不同版本:

%template(SetFoo) SetWrapper<Foo>;

我必须注意那些参数std::set的方法,我必须扩展一个类,如下所示:

struct A {
  A(const std::set& s); // this cannot be used directly unfortunately
}

%extend A {
  A(const SetWrapper& s) { // need a constructor with SetWrapper
    A *p = new A(s.data); // reuse the constructor above
    return p;
  }
}