Поддержка 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?


person Vahagn    schedule 19.06.2010    source источник


Ответы (1)


Статическая функция определена только в родительском class B правильно? как в:

D::stat();

Не вызывается правильно? Вот почему SWIG не оборачивает функцию...

Что касается того, как вы можете получить доступ к функции, SWIG позволяет вам добавлять/скрывать/переносить функции из любого класса, который вы хотите, поэтому можно было бы «исправить» класс SWIG, чтобы предоставить доступ к stat().

Поверьте, синтаксис примерно такой:

%extend D {
   ...
}

Прошло некоторое время с тех пор, как я коснулся SWIG, поэтому я могу что-то неправильно вспомнить.

person Petriborg    schedule 20.06.2010
comment
Спасибо за ответ Петриборг. В C++ D::stat() вызывается, так как есть общедоступная функция B::stat(), а D публично наследуется от B. Проблема в том, что SWIG не обертывает D::stat(). При использовании %extend мне нужно переписать статистику: %extend D { static void stat() { B::stat(); } } Это устраняет проблему (т. е. тогда я могу вызвать % test::D_stat), но это обходной путь; Я имею в виду, что пишу код, который не должен; SWIG может справиться с этим автоматически; Я пойду этим путем, только если буду знать, что лучшего пути нет. Знатоки SWIG, подскажите, пожалуйста, другие способы (или скажите, что лучше нет)! - person Vahagn; 20.06.2010
comment
Я не знал, что в С++ вы можете вызывать статические методы дочернего класса таким образом, интересно. Это может быть обходной путь, но я думаю, я не удивлен, что это происходит. В Java вы также не наследуете статические методы IIRC. пожать плечами. - person Petriborg; 21.06.2010