gpt4 book ai didi

swig - 使用 Swig 忽略特定的重载方法

转载 作者:行者123 更新时间:2023-12-04 23:23:39 28 4
gpt4 key购买 nike

我正在制作一个 C++ 库的包装器,以便它可以从 Java 中使用,我正在用 Swig 做这个。

我面临的是我有一个类(class) SomeClass ,它有一些重载的方法( someMethod )。在这种重载方法中,一些接收我不想导出到包装器的复杂数据,还有一些我确实想要然后导出的简单数据。

我正在尝试使用 %rename("$ignore")指令,但要么我导出所有方法,要么没有。我还有另外两种类型的类 SimpleDataComplexData ,其中之一在命名空间 ns1 中另一个在 ns2 , SomeClass位于命名空间“ns3”中。

类(class)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_ */

类(class) 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_ */

i 文件片段如下所示:
%rename ("$ignore", fullname=1) "ns3::SomeClass::someMethod(const ns2::ComplexData&)";

但这不起作用。哪个是忽略方法的某些特定重载的正确方法?

完整的 .i 文件:
%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"

注意:我不认为它实际上无关,但为了以防万一,这些方法实际上会抛出异常。

注2:我也不认为相关,但目标语言是Java,源语言是C++。

最佳答案

你有没有试过只使用 %ignore 指令,http://www.swig.org/Doc1.3/SWIG.html#SWIG_rename_ignore ?退房 http://www.swig.org/Doc1.3/SWIGPlus.html#ambiguity_resolution_renaming查看如何最好地匹配您要忽略的函数。

还要注意“%rename 指令的位置是任意的,只要它出现在要重命名的声明之前”,你的 %rename 是否在函数之前?

(在您的示例中,您缺少类名,我认为这只是一个错字,对吗?)

关于swig - 使用 Swig 忽略特定的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com