Swig typemaps с умными указателями

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

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());
}
</entity></entity>

... и следующую декларацию карты SWIG:

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

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

%template(EntityWatchPtr) watch_ptr<entity>;
</entity>

Это работает как ожидается при вызове функции атрибута на Entity* из Python. Однако SWIG игнорирует типовую карту при вызове функции watch_ptr. Мой скрипт 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="" type="" 'entity="" *'="" at="" 0x100b15ba0=""> >
Typemapped value
<module.entitywatchptr; proxy="" of="" <swig="" object="" type="" 'watch_ptr<="" entity=""> *' at 0x100b613c0> >
Entity::value()
</module.entitywatchptr;></module.entity;>

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

1 ответ

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

%template(EntityWatchPtr) watch_ptr<entity>;
</entity>

до карты:

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

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

<module.entity; proxy="" of="" <swig="" object="" type="" 'entity="" *'="" at="" 0x10b7b3ba0=""> >
Typemapped value
<module.entitywatchptr; proxy="" of="" <swig="" object="" type="" 'watch_ptr<="" entity=""> *' at 0x10b7ff3c0> >
Typemapped value
</module.entitywatchptr;></module.entity;>

licensed under cc by-sa 3.0 with attribution.