具有智能指针的Swig类型图

时间:2014-12-25 21:11:13

标签: python c++ swig

我有以下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

1 个答案:

答案 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