您要实现的目标似乎是强类型。默认情况下,SWIG 尝试公开具有与 C++ 中相同行为的接口,因此在这种情况下,行为是预期的 - 弱类型定义都是 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
函数返回不同的类型。
如果你想避免头文件和接口文件之间的重复,你可以引入一个宏来帮助,头文件变成:
#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 的类似问题上给出的答案的第一部分会起作用 - 你想详细说明空结构,但如果游戏中没有任何继承。