Создание чековой карты типов кроме деструктора - PullRequest
0 голосов
/ 10 декабря 2018

Я использую 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, но я не думаю, что это имеет значение.

1 Ответ

0 голосов
/ 11 декабря 2018

Я нашел решение случайно.Добавление этого после определения класса приведет к удалению проверки из деструктора при сохранении его во всех других функциях.

%extend TStdFunc 
{
  %typemap(check) TStdFunc* ""
}

Я предполагаю, что это работает, потому что% extend повторно открывает определение класса, и код деструктора генерируется, когда определениекласса закончен.

...