我有一些代码如下:
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生成其他代理类,但是我在搜索后找不到一些相对信息。
我尝试%重命名,但它仅生成一个代理类,而不是三个。
您要实现的目标似乎很强。默认情况下,SWIG试图以与您在C 中看到的相同行为的界面露出一个接口,因此在这种情况下,这种行为是预期的 - 弱Typedefs都是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 the typedef,我完全撒谎了RoadType
等的类型和存在,但这是可以的,因为SWIG生成的所有代码都是合法而正确的仍然。
这导致在make_X
函数返回不同类型的情况下生成接口。
如果您想避免在标题文件和接口文件之间进行重复,则可以引入宏来提供帮助,则标头文件将变为:
#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(); }
这意味着接口文件可以简单地变为:
%module test
%{
#include "test.h"
%}
%include <std_string.i>
#define STRONG_TYPEDEF(o, n) struct n : o {};
%include "test.h"
此作用部分是因为SingleValue
是一类,因此强大的Typedef可以成为Java类型系统中的子类,以便进行检查。如果类型不是类,您仍然可以在不使用继承的情况下做同样的事情,例如,我在使用D的类似问题上给出的答案的第一部分会起作用 - 您想详细介绍空的结构游戏中没有任何继承。