SWIG 在类中忽略 %mutable;如何解决?

Posted

技术标签:

【中文标题】SWIG 在类中忽略 %mutable;如何解决?【英文标题】:SWIG ignores %mutable in class; how to work around? 【发布时间】:2014-04-25 16:25:36 【问题描述】:

在 Windows 上使用 SWIG 3.0.0,导出到 python,我有以下接口文件:

%module example

%immutable;

class MyClass 
 public:
%mutable;
  char *str1;
%immutable;
  char *str2;
;

我的意图是让整个文件中的所有类成员默认不可变(只读),但允许一些可写——在本例中为 str1。

但是 SWIG 似乎忽略了类中的 %mutable 指令;它永远不会为 str1 或 str2 生成任何MyClass_str1_set 方法。我已经通过了文档,看起来这应该有效。我也尝试将%mutable MyClass::str1; 放在顶层,但这也无济于事。我错过了什么?

【问题讨论】:

【参考方案1】:

从文档中并不清楚,现在无法测试,但这可能有效:

// make everything immutable except str2 data member:
%feature("immutable","1");
%feature("immutable","0") MyClass::str2;

class MyClass 
 public:
  char *str1;
  char *str2;
  char *str3;
;

如果这不起作用,您还可以尝试在类中移动语句:

class MyClass 
 public:

  // make everything immutable except str2 data member:
  %immutable;   
  char *str0;
  char *str1;

  %mutable;   
  char *str2;

  %immutable;   
  char *str3;
  char *str4;
;

【讨论】:

您的第一个解决方案有效。我的问题之一是 %mutable 在这里不起作用;你必须%feature("immutable","0") MyClass::str1。而且你必须在课堂之外,在***拥有它。您的第二个解决方案可能会奏效,但我必须在每个班级都输入%immutable,这会很烦人。感谢您的帮助! @garyo 很高兴听到,感谢更新。如果您不介意,请说明为什么不赞成,我也许可以改善答案。干杯!

以上是关于SWIG 在类中忽略 %mutable;如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

python_如何在类中定义装饰器

swig 对基类“std::string”一无所知,被忽略

Android - proguard 忽略 -keep 的 Swig 方法

如何在类中声明const并获取针对mailchimp列表的字段名称

Tkinter - 在类中使用Button命令从另一个类调用函数