我正在使用SWIG创建一个Python界面,以允许我的C ++程序使用插件。
我有一些可能看起来像这样的类:
class TStdFunc
{
public:
void SetColor(unsigned);
unsigned GetColor() const;
bool IsValid() const;
};
用户可以删除对象。实际上,这只是将其移至撤消堆栈,因此用户可以撤消操作。但是,当一个对象被“删除”时,我不希望插件对其进行更改。
因此,我创建了这样的类型图:
%typemap(check) TStdFunc*
{
if(!$1->IsValid())
SWIG_exception_fail(SWIG_RuntimeError, "Element is not valid");
}
这很好。如果一个插件存储了对该对象的引用,并在对象被“删除”后尝试调用SetColor()或GetColor(),则会出现异常。
但是,该检查也已添加到SWIG创建的函数_wrap_delete_TStdFunc中。因此,当从Python中销毁对象时,我也会遇到异常。那么,如何删除除删除功能之外的所有功能呢?我可以禁用删除功能的类型映射吗?
PS。这当然是简化的解释。这些对象实际上是用boost :: shared_ptr包装的,但是我认为这并不重要。
答案 0 :(得分:0)
我偶然找到了解决方案。在类定义之后添加此选项将从析构函数中删除该检查,同时将其保留在所有其他函数中。
%extend TStdFunc
{
%typemap(check) TStdFunc* ""
}
我认为这是可行的,因为%extend重新打开了类定义,并且在类定义完成时生成了析构函数代码。