. Это дубликат моего вопроса в списке рассылки SWIG .
Я пытаюсь использовать контейнеры stl в своих привязках SWIG.Все работает отлично, за исключением обработки карт stl в Perl. На стороне С++ у меня есть
std::map TryMap(const std::map &map) {
std::map modified(map);
modified["7"] = "!";
return modified;
}
Конфигурация SWIG выглядит так
%module stl
%include "std_string.i"
%include "std_map.i"
%template(StringStringMap) std::map;
%{
#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.
Я считаю, что есть способ решить эту проблему, потому что SWIG прекрасно решает эту конкретную проблему в Python и даже в Perl, если я использую векторы и строки stl, но не карты.
Есть ли способ обрабатывать карту stl с помощью Perl в SWIG? Я использую последнюю версию 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