【发布时间】:2018-12-10 17:46:05
【问题描述】:
我正在使用 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 包裹的,但我认为这并不重要。
【问题讨论】: