我有一些代码如下:
class SingleValue
{
public:
SingleValue()
{}
~SingleValue()
{}
const std::string& getValue()const
{
return m_nSingleValue;
}
private:
int m_nSingleValue;
};
typedef SingleValue RoadType;
typedef SingleValue RoadSubType;
typedef SingleValue FunctionalClass;
现在我想用 SWIG 生成一个 Java 包装器,但它只生成一个代理类 'SingleValue',我想知道如何使用 swig 生成另一个代理类,但我在谷歌搜索后找不到相关信息.
我尝试 %rename,但它只生成一个代理类,而不是三个。
最佳答案
您要实现的目标似乎是强类型化。默认情况下,SWIG 会尝试公开一个与您在 C++ 中看到的行为相同的接口(interface),因此在这种情况下,行为是预期的——弱类型定义都是 C++ 提供的。不过,您可以解决这个问题。
给定头文件:
#include <string>
class SingleValue
{
public:
SingleValue()
{}
~SingleValue()
{}
std::string getValue() const
{
return std::to_string(m_nSingleValue);
}
private:
int m_nSingleValue;
};
typedef SingleValue RoadType;
typedef SingleValue RoadSubType;
typedef SingleValue FunctionalClass;
inline RoadType make_road() { return RoadType(); }
FunctionalClass make_func() { return FunctionalClass(); }
这与您的不同之处仅在于对 getValue()
的更正以及添加了两个用于测试的内联函数,我们可以通过以下方式包装它并接近强 typedef 语义:
%module test
%{
#include "test.h"
%}
%include <std_string.i>
class SingleValue
{
public:
SingleValue();
~SingleValue();
std::string getValue() const;
};
struct RoadType : public SingleValue {
};
struct RoadSubType : public SingleValue {
};
struct FunctionalClass : public SingleValue {
};
RoadType make_road();
FunctionalClass make_func();
请注意,我根本没有向 SWIG 展示 typedef,而且我完全撒谎了 RoadType
等的类型和存在,但这没关系,因为所有代码都得到SWIG 生成的代码仍然合法且正确。
这会导致在 make_X
函数返回不同类型的地方生成一个接口(interface)。
如果你想避免头文件和接口(interface)文件之间的重复,你可以引入一个宏来帮助,头文件变成:
#include <string>
class SingleValue
{
public:
SingleValue()
{}
~SingleValue()
{}
std::string getValue() const
{
return std::to_string(m_nSingleValue);
}
private:
int m_nSingleValue;
};
#ifndef STRONG_TYPEDEF
#define STRONG_TYPEDEF(o,n) typedef o n
#endif
STRONG_TYPEDEF(SingleValue, RoadType);
STRONG_TYPEDEF(SingleValue, RoadSubType);
STRONG_TYPEDEF(SingleValue, FunctionalClass);
inline RoadType make_road() { return RoadType(); }
FunctionalClass make_func() { return FunctionalClass(); }
这意味着接口(interface)文件可以简单地变成:
%module test
%{
#include "test.h"
%}
%include <std_string.i>
#define STRONG_TYPEDEF(o, n) struct n : o {};
%include "test.h"
部分原因是 SingleValue
是一个类,因此强类型定义可以成为 Java 类型系统中的一个子类,以强制检查。如果类型不是类,您仍然可以在不使用继承的情况下做同样的事情,例如 the first part of an answer I gave on a similar problem使用 D 会起作用 - 如果没有任何继承在起作用,您会想要详细说明空结构。
关于java - 如何在swig中使用同一个接口(interface)生成两个代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247223/