Поддержка SWIG для наследования статических функций-членов
SWIG не переносит унаследованные статические функции производных классов. Как это можно решить?
Вот простая иллюстрация проблемы.
Это простой заголовочный файл C++:
// file test.hpp
#include <iostream>
class B
{
public:
static void stat()
{ std::cerr << "=== calling static function B::stat" << std::endl; }
void nonstat() const
{ std::cerr << "==== calling B::nonstat for some object of B" << std::endl; }
};
class D : public B {};
Исходный файл C++ содержит только заголовочный файл:
// file test.cpp
#include "test.hpp"
Файл интерфейса SWIG включает в себя только заголовочный файл C++:
// file test.swig
%module test
%{
#include "test.hpp"
%}
%include "test.hpp"
Затем я генерирую код оболочки Swig следующим образом:
swig -c++ -tcl8 -namespace main.swig
И тогда я создаю общую библиотеку следующим образом:
g++ -fpic -Wall -pedantic -fno-strict-aliasing \
test.cpp test_wrap.cxx -o libtest.so
Таким образом, при загрузке libtest.so в интерпретаторе tcl и попытке использовать упакованный интерфейс он имеет следующее поведение:
% load libtest.so test
% test::B b
% test::D d
% b nonstat # works fine
% d nonstat # works fine
% test::B_stat # works fine
% test::D_stat # DOESN'T WORK !!
Итак, вопрос в том, как я могу сделать SWIG, чтобы обернуть D::stat?
1 ответ
Статическая функция определяется только в родительском class B
правильный? как в:
D::stat();
Не правильно ли вызывается? Вот почему SWIG не оборачивает функцию...
Что касается того, как вы можете получить доступ к функции, SWIG позволяет вам добавлять / скрывать / переносить функции из любого класса, который вы хотите, так что было бы возможно "исправить" класс SWIG, чтобы предоставить доступ к stat()
,
Поверьте, синтаксис что-то вроде:
%extend D {
...
}
Прошло много времени с тех пор, как я прикоснулся к SWIG, поэтому я мог что-то напомнить.