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

标签 python c++ swig

我正在使用 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/

相关文章:

python - Swig C 到 Python ImportError : undefined symbol

python - jupyter notebook ipython 小部件显示为文本

python - ZIP 格式重复字符

c++ - 理解 C++11 中的正则表达式

c++ - 二进制表达式的无效操作数(字符串到字符串(又名基本字符串))

python - 如何使用 SWIG 包装许多 .h 文件并包含任何依赖项?

c# - 如何使用 SWIG 将 IEnumerable 作为参数的 C++ 委托(delegate)从 C# 创建传递?

python - 为 Eclipse 安装 Pydev 抛出错误

python - 如何在 prometheus 中使用过滤器编写 API 查询

c++ - 实例化时为 NULL