Я создаю оболочку библиотеки C++, поэтому ее можно использовать с Java, я делаю это с помощью Swig.Игнорирование определенных перегруженных методов с помощью Swig
Что я вижу, так это то, что у меня есть класс SomeClass
, который имеет некоторые перегруженные методы (someMethod
). Из этих перегруженных методов некоторые получают сложные данные, которые я не хочу экспортировать в оболочку, а некоторые простые, которые я хочу, затем экспортируют.
Я пытаюсь использовать директиву %rename("$ignore")
, но либо я получаю все методы экспортированы, либо ничего. У меня есть еще два типа классов SimpleData
и ComplexData
, один из них в пространстве имен ns1
, а другой в ns2
, SomeClass
находится в пространстве имен '' ns3`.
Класс SimpleData
:
#ifndef SIMPLEDATA_H_
#define SIMPLEDATA_H_
namespace ns1 {
class SimpleData {
public:
SimpleData(){}
virtual ~SimpleData(){}
};
} /* namespace ns1 */
#endif /* SIMPLEDATA_H_ */
Класс ComplexData:
#ifndef COMPLEXDATA_H_
#define COMPLEXDATA_H_
namespace ns2 {
class ComplexData {
public:
ComplexData(){}
virtual ~ComplexData(){}
};
} /* namespace ns2 */
#endif /* COMPLEXDATA_H_ */
SomeClass
Класс:
#ifndef SOMECLASS_H_
#define SOMECLASS_H_
#include "SimpleData.h"
#include "ComplexData.h"
namespace ns3 {
class SomeClass {
public:
SomeClass(){}
bool someMethod(const ns1::SimpleData & data){return true;}
bool someMethod(const ns2::ComplexData & data){return true;}
bool someMethod(const int & data){return true;}
bool anotherMethod();
virtual ~SomeClass(){}
};
} /* namespace ns3 */
#endif /* SOMECLASS_H_ */
двутавровых файл фрагмент кода выглядит следующим образом:
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData&)";
Но это не работает. Какой из них является правильным способом игнорировать определенную перегрузку метода?
Полный .и файл:
%module libSomeClass
%{
#include "../src/SomeClass.h"
%}
%pragma(java) jniclasscode=%{
static {
try {
System.loadLibrary("SWIG_C++");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. \n" + e);
System.exit(1);
}
}
%}
// SimpleData
%include "../src/SimpleData.h"
//removes too much
//%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod";
//does not work
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData &)";
%rename ("renamedMethod", fullname=1) "ns3::SomeClass::anotherMethod";
%include "../src/SomeClass.h"
Примечание: Я не думаю, что это на самом деле не имеет ничего общего, но только в случае, если эти методы на самом деле бросить исключение.
Note2: Я также не думаю, что это релевантно, но целевой язык - это Java, а исходным языком является C++.
в документации указано, что '% ignore' и'% rename ("$ ignore") '[точно такие же] (http://www.swig.org/Doc2.0/SWIGDocumentation.html # SWIG_advanced_renaming), за исключением того, что '% rename' является немного более гибким. Да, мой '% rename' находится перед объявлением функции (точнее до'% include'). Да, отсутствие названия класса - опечатка. Я смог найти решение, похоже, проблема с использованием ** котировок ** в сигнатуре метода нечетно. Во всяком случае, спасибо за ваш ответ, он заставляет меня пройти через документы снова, и благодаря этому я понял, что в примерах нет котировок. –