使用SWIG的Perl中的STL映射

时间:2012-06-22 13:30:44

标签: perl swig

这与我的question on SWIG mailing list重复。

我正在尝试在SWIG绑定中使用stl容器。除了在Perl中进行stl映射处理外,一切都很完美。在C ++方面,我有

std::map<std::string, std::string> TryMap(const std::map<std::string, std::string> &map) {
  std::map<std::string, std::string> modified(map);
  modified["7"] = "!";
  return modified;
}

SWIG配置看起来像这样

%module stl

%include "std_string.i"

%include "std_map.i"
%template(StringStringMap) std::map<std::string, std::string>;

%{
  #include "stl.h"
%}

%include "stl.h"

在我的Python脚本中,我可以这样调用TryMap

print dict(stl.TryMap({'a': '4'}))

获得漂亮的输出

{'a': '4', '7': '!'}

但在Perl中我打电话

print Dumper stl::TryMap({'a' => '4'});

并收到错误

TypeError in method 'TryMap', argument 1 of type 'std::map< std::string,std::string > const &' at perl.pl line 7.

我实际上可以做类似

的事情
my $map = stl::TryMap(stl::StringStringMap->new());
print $map->get('7');

并获取'!',但这不是一个选项,因为有很多遗留代码使用“TryMap”,希望将普通的Perl哈希作为输出。

我相信有一种方法可以解决这个问题,因为如果我使用stl向量和字符串而不是map,SWIG可以很好地解决Python中的这个特殊问题,甚至在Perl中也是如此。

有没有办法在SWIG中使用Perl处理stl地图?我正在使用最新的SWIG 2.0.7

更新可能perl5/std_map.i出现了问题。它太短了=)

$ wc -l perl5/std_map.i python/std_map.i 
   74 perl5/std_map.i
  305 python/std_map.i

1 个答案:

答案 0 :(得分:-1)

你试过了吗?

print Dumper stl::TryMap(('a' => '4'));