Это дубликат моего вопроса в списке рассылки SWIG.
Я пытаюсь использовать stl-контейнеры в своих привязках SWIG. Все работает отлично, за исключением обработки stl-карт в Perl. На стороне С++ у меня есть
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 script я могу вызвать 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 как свой вывод.
Я считаю, что есть способ работать, потому что SWIG хорошо решает эту проблему в Python и даже в Perl, если я использую stl-векторы и строки, но не карты.
Есть ли способ обработать stl-карту с Perl в SWIG? Я использую последний SWIG 2.0.7
UPDATE Возможно, что-то не так с perl5/std_map.i
. Он слишком короткий =)
$ wc -l perl5/std_map.i python/std_map.i
74 perl5/std_map.i
305 python/std_map.i