我正在使用 SWIG 创建一个 Python 接口(interface),以允许我的 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 中销毁时,我也会得到一个异常。那么如何检查除删除功能以外的所有功能呢?我可以禁用删除功能的类型映射吗?
附言。这当然是一个简化的解释。这些对象实际上是用 boost::shared_ptr 包装的,但我认为这无关紧要。
最佳答案
我偶然发现了一个解决方案。在类定义之后添加它将从析构函数中删除检查,同时将其保留在所有其他函数中。
%extend TStdFunc
{
%typemap(check) TStdFunc* ""
}
我认为这是可行的,因为 %extend 重新打开类定义,并且在类定义完成时生成析构函数代码。
关于python - 在析构函数中创建检查类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710949/