Расширение "неполных" типов (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;
В файле интерфейса подавить генерацию конструктора / деструктора и заставить его пройти через библиотеку.