我有以下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());
}
...以及以下SWIG类型图声明:
%typemap(out) std::string Entity::value
{
$result = PyString_FromString("Typemapped value");
}
watch_ptr class向Python公开,我声明了所有可以包装的类型:
%template(EntityWatchPtr) watch_ptr<Entity>;
当从Python调用Entity*
上的属性函数时,这可以正常工作。但是,在watch_ptr<Entity>
上调用时,SWIG会忽略类型映射。我的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
答案 0 :(得分: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