将SWIG与C+;一起使用时,没有针对Java的迭代器+';s std::map 我用C++实现了一个类:代码> STD::MAP,使用SWIG创建的接口是java调用的。但是,没有迭代器对象允许我遍历SWIG包装的std::map中的条目。有人知道如何创建迭代器吗?

将SWIG与C+;一起使用时,没有针对Java的迭代器+';s std::map 我用C++实现了一个类:代码> STD::MAP,使用SWIG创建的接口是java调用的。但是,没有迭代器对象允许我遍历SWIG包装的std::map中的条目。有人知道如何创建迭代器吗?,java,c++,java-native-interface,swig,Java,C++,Java Native Interface,Swig,为了能够在Java中迭代对象,它需要实现Iterable。这又需要名为iterator()的成员函数,该函数返回迭代器的适当实现 %javamethodmodifiers MapIterator::nextImpl "private"; %inline %{ struct MapIterator { typedef std::map<int,std::string> map_t; MapIterator(const map_t& m) : it(m.beg

为了能够在Java中迭代对象,它需要实现
Iterable
。这又需要名为
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;    
  };
%}
从您的问题来看,不太清楚您在映射中使用的是什么类型,以及您是否希望能够迭代这些对(就像在C++中那样)、键还是值。这三个变量的解决方案基本相似,下面的示例选取了这些值

首先,我用来测试的SWIG接口文件的序言:

%module test

%include "std_string.i"
%include "std_map.i"
为了实现iterable映射,我在SWIG接口文件中声明、定义并包装了另一个类。这个类,
MapIterator
为我们实现了
Iterator
接口。它是java和包C++的混合体,其中一个比另一个更容易编写。首先是一些Java,一个类型映射,给出了它实现的接口,然后是
Iterable
接口所需的三种方法中的两种,作为类型映射给出:

%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();
  }
%}
最后,我们需要告诉SWIG,我们正在包装的
std::map
实现了
Iterable
接口,并提供了一个额外的成员函数,用于包装
std::map
,该函数返回我们刚刚编写的
MapIterator
类的一个新实例:

%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>;
%typemap(javainterfaces)std::map“Iterable”
%newobject std::map::iterator()const;
%扩展std::map{
MapIterator*迭代器()常量{
返回新的映射器(*$self);
}
}
%模板(MyMap)std::map;
这可能更通用,例如使用宏来隐藏贴图的类型,这样,如果您有多个贴图,只需像使用
%template
一样,为相应的贴图“调用”宏即可


原语类型的映射也有一点复杂-您需要安排Java端使用
Double
/
Integer
,而不是
Double
/
int
(我相信自动装箱是一个术语),除非您已经决定换行对,否则在这种情况下,您可以使用基元成员创建一个对。

您需要精确说明非“所有”条目的含义。有什么特别的吗,比如最后一件丢失的东西?分享一些代码来向我们展示你是如何进行互操作的?抱歉,准确地说,我根本无法执行任何迭代。快速的谷歌搜索发现:也许它有帮助