SWIG不可变的std :: map引用

时间:2015-01-26 18:10:36

标签: c++ swig

我在C ++中有一个类似于以下内容的typedef:

typedef std::map<int, TestClass> TestClassMap;

我有另一个返回const TestClassMap&的课程。

然后在SWIG的界面(.i)文件中,我有以下内容:

namespace std
{
    %template(TestClassMap) map<int, myNamespace::TestClass>;
}

编译好并创建C#库。

但是,在C#库中,返回const TestClassMap&的函数实际上返回了一个可以更改的TestClassMap(可变)。如果我查看返回对象的IsReadOnly设置,则为false。

通过查看SWIG文档,看起来有一种方法可以将对象标记为immutable,我认为这就是我想要的。但是,我试图这样做并没有取得任何成功。我尝试过以下各项:

%feature("immutable","1") TestClass;

%immutable TestClass;

%immutable
%template(TestClassMap) map<int, myNamespace::TestClass>;
%mutable

是否有一些潜在的原因导致const std::map<>&无法变为不可变?还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

SWIG不会尝试保持const正确性。请参阅文档中的this rant

  

虽然这显然违反了C ++类型系统,但修复问题似乎并不值得在SWIG运行时类型系统中支持它所需的额外实现复杂性。在将来的版本中没有计划对此进行更改(尽管我们永远不会完全排除任何内容)。

     

最重要的是,对于大多数SWIG项目而言,这个特定问题似乎不是问题。当然,如果维护constness是项目中最重要的部分,您可能需要考虑使用其他工具。