C++でstd::map
のクラスを実装し、SWIGを使用してJavaからコールするインターフェイスを作成しました。しかし、イテレータオブジェクトがないので、SWIGのエントリを繰り返し処理することができます。std::map
。誰もイテレータを作成する方法を知っていますか?C++のstd :: mapでSWIGを使用する場合、Javaのイテレータはありません
答えて
Javaでオブジェクトを反復処理できるようにするには、Iterable
を実装する必要があります。これには、Iterator
の適切な実装を返すiterator()
というメンバ関数が必要です。
マップからどのタイプを使用しているのか、ペア(C++の場合のように)、キーまたは値を繰り返し処理できるようにしたいのかどうかは疑問です。 3つの変形に対する解決法は実質的に同様であり、以下の例では値を選択した。最初
まず、物事、私はこれをテストするために使用SWIGインタフェースファイルのためのプリアンブル:反復可能なマップを実現するために
%module test
%include "std_string.i"
%include "std_map.i"
私は、宣言に定義され、SWIGインタフェースファイル内の別のクラスをラップしました。このクラスのMapIterator
は、Iterator
インターフェイスを実装しています。これは、JavaとラップされたC++が混在していて、他のものよりも簡単に書くことができます。まずタイプマップとして与えられたいくつかのJava、それは実装インタフェースとIterable
インターフェイスに必要な3つの方法の2つを与えるタイプマップ、:
%typemap(javainterfaces) MapIterator "java.util.Iterator<String>"
%typemap(javacode) MapIterator %{
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}
public String next() throws java.util.NoSuchElementException {
if (!hasNext()) {
throw new java.util.NoSuchElementException();
}
return nextImpl();
}
%}
はその後、我々はプライベートを持っているC++ MapIterator
の一部を供給next()
の例外をスローする例外を除くすべての実装と、イテレータに必要な状態(std::map
自身のconst_iterator
の表現で表されます)。
%javamethodmodifiers MapIterator::nextImpl "private";
%inline %{
struct MapIterator {
typedef std::map<int,std::string> map_t;
MapIterator(const map_t& m) : it(m.begin()), map(m) {}
bool hasNext() const {
return it != map.end();
}
const std::string& nextImpl() {
const std::pair<int,std::string>& ret = *it++;
return ret.second;
}
private:
map_t::const_iterator it;
const map_t& map;
};
%}
は最後にstd::map
我々がIterable
インタフェース実装をラップしていることをSWIGを伝え、私達はちょうど書いたMapIterator
クラスの新しいインスタンスを返しますstd::map
をラップする目的のために、余分なメンバ関数を提供する必要があります。
%typemap(javainterfaces) std::map<int,std::string> "Iterable<String>"
%newobject std::map<int,std::string>::iterator() const;
%extend std::map<int,std::string> {
MapIterator *iterator() const {
return new MapIterator(*$self);
}
}
%template(MyMap) std::map<int,std::string>;
これにより、複数のマップを持っている場合、それはあなたが%template
で行うと同じように、適切なマップのマクロを「呼び出し」の問題だけだようなマップの種類を非表示にするには、例えば、マクロで、より一般的な可能性があり。
プリミティブ型のマップとのわずかな合併症でもあります - あなたがペアをラップすることを決定しない限り、あなたは、(私は信じているオートボクシング用語である)の代わりにdouble
/int
のDouble
/Integer
を使用するJava側の手配をする必要がありますすでにプリミティブメンバーとペアを組むことができます。
- 1. SWIGでPHPのstd :: mapを繰り返し処理する
- 2. C++ std :: system 'system' stdのメンバーではありません
- 3. std :: setの代わりにstd :: unordered_setを使用する場合
- 4. std :: mapをstd :: mapのキーとして使用する
- 5. 同じタイプのイテレータを使用している場合、「演算子は一致しません」
- 6. map/iteratorはインクリメンタルマップではありません。インクリメンタルではありません。
- 7. イテレータは何の理由もありません。C++
- 8. イテレータからstd :: mapの値を変更します
- 9. C++ - クラス名をstd :: mapのキーとして使用する方法はありますか?
- 10. C++ 0xタプルにイテレータはありません。
- 11. Javaでは、ヌルポインタが起きた場合はほとんどありません。
- 12. std :: mapクラスのイテレータを定義する方法
- 13. C++:std :: map sorting
- 14. C#XNA Xboxの場合、オプションのパラメータはオプションではありません
- 15. CバージョンのC++ std :: map
- 16. std map複合キー
- 17. 私のstd :: list実装のイテレータは動作しません
- 18. 適切なデフォルトコンストラクタはありません - イテレータ?
- 19. イテレータに一致するコンストラクタがありません
- 20. std :: mapとstd :: setを交差/ diffする方法はありますか?
- 21. std :: mapのstd :: reference_wrapperをキーとして使用する
- 22. std :: mapをstd :: stringキーとintキーで使用するコスト?
- 23. std :: listのtypemapをどのように作成しますか?SWIGのC++とJavaのリスト<String>への<std::string>は? SWIGで
- 24. std :: mapは初期化する必要がありますか?
- 25. Poco :: anyのstd :: mapを反復できません::
- 26. テンプレートクラス値のC++ std :: map
- 27. boost :: bindをマップで使用すると、std :: pairとstd :: map :: value_typeのバインディングはどうなりますか?
- 28. イテレータのタイプが正しくありません
- 29. {render json:}を使用した場合の属性がありません
- 30. std :: mapをstd :: setをC++にコピー
「すべて」の項目ではないことを正確に示す必要があります。最後のアイテムが見つからない場合は、具体的なものは何ですか?相互運用性の仕組みを示すコードを共有していますか? –
申し訳ありませんが、正確に言えば、私は反復を全く実行することができません。 – delita
すばらしいGoogle検索でこれが見つかりました:http://chadretz.wordpress.com/2009/11/27/stl-collections-with-java-and-swig/多分役立つでしょう – Tim