SWIG: std / multimap.i кажется неработающим для упаковки Tcl - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь обернуть класс ContainerMap, который предоставляет один элемент данных для нескольких карт:

    namespace MYCLASSES {
    class ContainedAttributes {
      std::string _value;
    };
    class NameList {
    public:
      std::vector<std::string> _names;
    };
    typedef std::multimap<NameList, ContainedAttributes> ContainerMap;
    class Container {
    public:
      ContainerMap _contents;
    };
    }

Очевидно, что API C ++ для указанных классов более сложен, но на уровне Tcl мне просто нужно перебрать элементы _contents и взглянуть на содержимое ContainedAttributes. Я написал SWIG-код, который выглядит следующим образом:

    %module myclasswrapper
    %nodefaultctor; // Disable creation of default constructors
    %nodefaultdtor; // Disable creation of default constructors
    %include <stl.i>
    %include <std_string.i>
    %include <std_vector.i>
    %include <std/std_multimap.i>
    %{
    #include "my_classes.h"
    #include <vector>
    #include <string>
    #include <map>
    %}
    namespace MYCLASSES {
    using namespace std;
    class NameList {
        vector<string> _names;
    };
    class Container {
    };
    class ContainedAttributes {
    };
    }
    using namespace MYCLASSES;
    using namespace std;
    %template(ContainerMap) multimap<NameList, ContainedAttributes >;
    %template(StringVector) vector<string>
    namespace MYCLASSES {
    %extend Container {
      MYCLASSES::ContainerMap & get_contents {
        return self->_contents;
      }
    }
    <more code here>
    }
    %clearnodefaultctor; // Enable the creation of default constructors again
    %clearnodefaultdtor; // Enable the creation of default constructors again

Очевидно, есть дополнительный код для переноса других классов. Независимо от того, какую версию SWIG я использую, я всегда получаю одну и ту же ошибку:

      > swig -c++ -tcl8 -ltclsh.i example.i
      .../share/swig/4.0.0/std/std_multimap.i:89: Error: Syntax error in input(3).

Я провел много испытаний, включая комментирование некоторых оскорбительных строк в файле std_multimap.i, но я не могу заставить его даже правильно скомпилироваться. Даже после комментирования строк, составляющих swig barf (строки 89 и 98), я все еще не могу скомпилировать сгенерированный код-обертку, поскольку swig, похоже, хочет сгенерировать обертки-конструкторы для класса контейнера с одним строковым векторным аргументом. Правильно ли я пришел к выводу, что на самом деле нет поддержки мультикартовых контейнеров для цели Tcl, или я просто совершаю какую-то глупую ошибку? Если мой вывод верен, как бы вы посоветовали написать код Swig, чтобы получить итераторы, которые я могу использовать для чтения содержимого мультикарты?

1 Ответ

0 голосов
/ 09 мая 2019

Я нашел следующую ссылку , которая обеспечивает несовершенный обходной путь. Несовершенный в том смысле, что он не обеспечивает полноценного переноса всех функций мультикарты, а интерфейс неудобен: например, Итераторами можно манипулировать только как методами расширения самого контейнера. И, конечно, доступ для записи не предоставляется, но для моей цели это ограничение в порядке. Я все еще ищу лучшего ответа.

...