std::set 支持 java swig
std::set support in java swig
在我的 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::vector
, std::string
, std::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...
};
在这两种情况下,我都被这个迭代器问题困住了,无法提供 "simple" 解决方案。
我试过 swig/Lib/std 也暂时没有成功。
我最终决定放弃迭代器并想出了一个简单的包装头来满足我的需要:
#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
的方法我必须扩展 class 如下所示:
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;
}
}
在我的 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::vector
, std::string
, std::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...
};
在这两种情况下,我都被这个迭代器问题困住了,无法提供 "simple" 解决方案。
我试过 swig/Lib/std 也暂时没有成功。
我最终决定放弃迭代器并想出了一个简单的包装头来满足我的需要:
#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
的方法我必须扩展 class 如下所示:
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;
}
}