2015-09-28 52 views
0

在我的java代碼中,我想調用std::set的默認構造函數,並插入一個例如在C++以下代碼:std :: set在java swig中的支持

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

provides support for various STL containers for java痛飲諸如std::vectorstd::stringstd::map ...但是存在用於std::set沒有支持。

所以我發現這個solution它涉及一個C++包裝和一個java包裝。我還沒有嘗試過,我不確定它會起作用,我覺得不方便。

我們可以通過提出一個處理基本set構造函數和插入的最小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也沒有成功的時刻。

回答

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; 
    } 
} 
+0

你還對「更好」的解決方案感興趣嗎? – Flexo

+0

如果您有任何感謝,謝謝! – coincoin