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

Creating check typemap except in destructor

我正在使用 SWIG 创建一个 Python 接口以允许我的 C++ 程序使用插件。

我有一些 类 可能看起来像这样:

class TStdFunc
{
public:
  void SetColor(unsigned);
  unsigned GetColor() const;
  bool IsValid() const;  
};

用户可以删除一个对象。这实际上只是将它移动到撤消堆栈,以便用户可以撤消操作。然而,当一个对象已经 "deleted" 我不想让插件改变它。

因此我创建了一个这样的类型映射:

%typemap(check) TStdFunc*
{
  if(!->IsValid())
      SWIG_exception_fail(SWIG_RuntimeError, "Element is not valid");
}

效果很好。如果插件存储了对对象的引用,并在对象 "deleted" 之后尝试调用 SetColor() 或 GetColor(),我会得到一个异常。

然而,检查也被添加到 SWIG 创建的函数 _wrap_delete_TStdFunc 中。所以当对象从 Python 被销毁时,我也得到一个异常。那么如何检查除删除功能以外的所有功能呢?我可以禁用删除功能的类型映射吗?

PS。这当然是一个简化的解释。这些对象实际上是用 boost::shared_ptr 包裹的,但我认为这无关紧要。

无意中找到了解决办法。在 class 定义之后添加它将从析构函数中删除检查,同时将其保留在所有其他函数中。

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

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

我刚刚 运行 遇到了类似的问题。 %extend 技巧在我的情况下不起作用,所以我求助于检查类型映射中的函数名称,如下所示:

%typemap(check) TStdFunc* %{
    if (strcmp("$symname", "delete_TStdFunc"))
        if(!->IsValid())
            SWIG_exception_fail(SWIG_RuntimeError, "Element is not valid");
%};