SWIG: работа с перегруженными методами базового класса в производном классе

Я изо всех сил пытаюсь сделать это несколько элегантно в SWIG …

У меня есть базовый класс, который содержит перегруженный метод create:

class Base {
public:
virtual Foo *create(ClassA &, ClassB &) = 0;
Foo *create(int id) {
// get ClassA a and ClassB b from an internal store related to id
return create(a, b);
}
};

Это, конечно, SWIG-завернутый без хлопот.

В других местах / репозиториях есть несколько различных производных классов Base, которые, конечно, определяют свою собственную версию чистого виртуального создания (ClassA&, ClassB&), но им не нужно определять вариант create (int), потому что версии базового класса должно быть достаточно.

Обтекание SWIG этих производных классов видит только метод create (), определенный в производном классе, и не предусматривает вариант с одним параметром int, даже если они должны наследовать его от базового класса.

Я пытался использовать% rename для методов базового класса, чтобы получить то, что работает, например.

%rename (_create1) Base::create(ClassA&,ClassB&);
%rename (_create2) Base::create(int);

%extend (Base) {
%pythoncode {
def create(self, a_or_id, b=None):
if b is not None:
self._create1(a_or_id, b):
else:
self._create2(a_or_id)
}
}

Это выглядит нормально в сгенерированном коде python / _wrap.cc, но оболочка для производного класса просто обернет метод create (), как будто% renames не существует.

Oни являются в отдельных файлах .i, но каждый из файлов .i производных классов импортирует файл .i базовых классов, поэтому наследование классов python является правильным, это просто наследование классов C ++, которое несколько побеждено этим переопределенным методом.

В идеале мне бы хотелось решение, в котором мне не нужно было вставлять операторы% rename во все файлы .i производных классов (хотя я знаю, что это решило бы проблему), это просто означало бы очень много дублированного кода.

Есть идеи?

2

Решение

Вы уверены, что классы объявлены правильно? Виртуальные методы с тем же именем в производном классе скрывают методы базового класса, если только using приносит базовую функцию в производное пространство имен. Пример:

class A
{
public:
void func(int a);
virtual void func(int a,int b);
};

class  B : public A
{
public:
//using A::func;
virtual void func(int a,int b);
};

С SWIG и Python я не смог написать:

b = B()
b.func(1)    # failed
b.func(1,2)

без раскомментирования using строка выше, и классы не работали правильно в C ++. С using, SWIG правильно выставил свои функции на Python, и C ++ тоже работал.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector