除了在析构函数中创建检查类型映射

时间:2018-12-10 17:46:06

标签: python c++ swig

我正在使用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包装的,但是我认为这并不重要。

1 个答案:

答案 0 :(得分:0)

我偶然找到了解决方案。在类定义之后添加此选项将从析构函数中删除该检查,同时将其保留在所有其他函数中。

%extend TStdFunc 
{
  %typemap(check) TStdFunc* ""
}

我认为这是可行的,因为%extend重新打开了类定义,并且在类定义完成时生成了析构函数代码。