Я использую 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 () после того, как объект был «удален», я получаю исключение.
Однако проверка также добавлена к функции _wrap_delete_TStdFunc, созданной SWIG.Поэтому, когда объект уничтожается из Python, я также получаю исключение.Итак, как мне проверить все функции, кроме функции удаления?Могу ли я отключить карту типов для функции удаления?
PS.Это, конечно, упрощенное объяснение.Объекты на самом деле обернуты в boost :: shared_ptr, но я не думаю, что это имеет значение.