如何使用SWIG中的相同接口生成两个代理类



我有一些代码如下:

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的类似问题上给出的答案的第一部分会起作用 - 您想详细介绍空的结构游戏中没有任何继承。

最新更新