1

我有一些如下代码:

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,但它只生成一个代理类,而不是三个。

4

1 回答 1

1

您要实现的目标似乎是强类型。默认情况下,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 的类似问题上给出的答案的第一部分会起作用 - 你想详细说明空结构,但如果游戏中没有任何继承。

于 2012-11-11T16:44:19.840 回答