расширение «неполных» типов (SWIG) - PullRequest
2 голосов
/ 03 апреля 2012

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

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

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

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

Большое спасибо заранее!

1 Ответ

4 голосов
/ 04 апреля 2012

Вы можете очень легко добавить дополнительные методы к типу, который был заранее объявлен в 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; 

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

...