Карты типов Swig с умными указателями

У меня есть следующий класс С++:

class Entity : public Watchable
{
public:
    [...]
    std::string value() const
    {
        return "Entity::value()";
    }
};

Entity* create_entity_pointer()
{
    return new Entity();
}

watch_ptr<Entity> create_entity_watch_pointer()
{
    return watch_ptr<Entity>(new Entity());
}

... и следующее объявление карты типов SWIG:

%typemap(out) std::string Entity::value
{
    $result = PyString_FromString("Typemapped value");
}

класс watch_ptr открыт для Python, и я объявляю все возможные типы что можно обернуть:

%template(EntityWatchPtr) watch_ptr<Entity>;

Это работает, как и ожидалось, при вызове функции атрибута для Entity* из Python. Однако SWIG игнорирует карту типов при вызове на watch_ptr<Entity>. Мой скрипт Python выглядит следующим образом:

from module import *
player1 = create_entity_pointer()
print(player1)
print(player1.value())
player2 = create_entity_watch_pointer()
print(player2)
print(player2.value())

Это дает следующий результат:

<module.Entity; proxy of <Swig Object of type 'Entity *' at 0x100b15ba0> >
Typemapped value
<module.EntityWatchPtr; proxy of <Swig Object of type 'watch_ptr< Entity > *' at 0x100b613c0> >
Entity::value()

Как я могу заставить typemap работать с умными указателями? Я разместил полный исходный код в Интернете: https://github.com/kermado/SwigSmartPtrs.


person Homar    schedule 25.12.2014    source источник
comment
У вас есть код, чтобы продемонстрировать, что работает, а что игнорируется?   -  person Mark Tolonen    schedule 26.12.2014
comment
Я предоставил более подробную информацию.   -  person Homar    schedule 26.12.2014


Ответы (1)


Итак, после некоторых экспериментов оказалось, что карты типов должны быть указаны перед объявлениями шаблона SWIG. Другими словами, мне нужно было объявить:

%template(EntityWatchPtr) watch_ptr<Entity>;

перед картой типов:

%typemap(out) std::string Entity::value
{
    $result = PyString_FromString("Typemapped value");
}

в моем файле интерфейса SWIG. Результат моей программы тогда:

<module.Entity; proxy of <Swig Object of type 'Entity *' at 0x10b7b3ba0> >
Typemapped value
<module.EntityWatchPtr; proxy of <Swig Object of type 'watch_ptr< Entity > *' at 0x10b7ff3c0> >
Typemapped value
person Homar    schedule 26.12.2014