这与我的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
答案 0 :(得分:-1)
你试过了吗?
print Dumper stl::TryMap(('a' => '4'));