У меня есть следующий класс С++:
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.