2015-01-26 2 views
1

У меня есть ЬурейиЙ в C++, который выглядит следующим образом:SWIG неизменен станд :: Карта ссылка

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

У меня есть еще один класс, который возвращает const TestClassMap&.

Тогда в моем интерфейсе (.i) файл для SWIG, у меня есть следующие:

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

Это нормально компилируется и создает C# библиотеки.

Однако в библиотеке C# функция, возвращающая const TestClassMap&, фактически возвращает TestClassMap, которая может быть изменена (изменена). Если я посмотрю на параметр IsReadOnly на возвращаемом объекте, он будет ложным.

От взгляда на документацию SWIG, похоже, есть способ отметить объект как immutable, который, я думаю, является тем, что я хочу. Тем не менее, я пытался сделать это и не имел никакого успеха. Я попробовал каждый из следующих:

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

%immutable TestClass; 

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

есть какая-то основная причина, почему const std::map<>& не может быть неизменны? Любые другие идеи?

ответ

1

SWIG не пытается сохранить const-correctness. Обратитесь к this rant в документации:

Хотя это явно нарушение типа-системы C++, фиксируя проблему, кажется, не стоит дополнительные сложности реализации, которые будут необходимы, чтобы поддержать его в SWIG система времени выполнения. Планируется изменить это в будущих выпусках (хотя мы никогда не будем править полностью).

Суть в том, что данная проблема не является проблемой для большинства проектов SWIG. Конечно, вы можете захотеть использовать другой инструмент, если сохранение константы является самой важной частью вашего проекта.

Смежные вопросы