Расширение "неполных" типов (SWIG)

Я ищу способ расширить (то есть добавить новые члены к типу, используя директиву% extension) тип, который определен в самом файле библиотеки, в то время как заголовочные файлы библиотеки предоставляют только прямое объявление для типа.

Обработка типа, как если бы его определение было известно во время компиляции, приводит к следующему предупреждению:

Warning 303: %extend defined for an undeclared class [name of the type].

Кто-нибудь знает решение или обходной путь для этой проблемы? Я уверен, что он есть, поскольку в документации SWIG говорится, что swig предполагает, что неизвестный тип является структурой или объединением каждый раз, когда находит его.

Спасибо заранее!

1 ответ

Решение

Вы можете очень легко добавить дополнительные методы к типу, который был заранее объявлен в SWIG, дав ему пустое определение в интерфейсе, например

test.h:

// Forward declare foo
struct foo;

test.i:

%module test

// Tell SWIG to wrap foo "properly", but that you don't know anything about it:
struct foo { };

%include "test.h"

%extend foo {
  void bar() {
    // Do stuff, probably with $self, here
  }
}

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

Поскольку вы, вероятно, будете полагаться на библиотеку для создания и уничтожения экземпляров, вы также захотите добавить:

%nodefaultctor foo; 
%nodefaultdtor foo; 

В файле интерфейса подавить генерацию конструктора / деструктора и заставить его пройти через библиотеку.

Другие вопросы по тегам