【问题标题】:Creating check typemap except in destructor在析构函数中创建检查类型图
【发布时间】: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 包裹的,但我认为这并不重要。

【问题讨论】:

    标签: python c++ swig


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-02
        • 2017-08-13
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多