我在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<>&
无法变为不可变?还有其他想法吗?
答案 0 :(得分:1)
SWIG不会尝试保持const正确性。请参阅文档中的this rant:
虽然这显然违反了C ++类型系统,但修复问题似乎并不值得在SWIG运行时类型系统中支持它所需的额外实现复杂性。在将来的版本中没有计划对此进行更改(尽管我们永远不会完全排除任何内容)。
最重要的是,对于大多数SWIG项目而言,这个特定问题似乎不是问题。当然,如果维护constness是项目中最重要的部分,您可能需要考虑使用其他工具。