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 ラッパーを生成したいのですが、1 つのプロキシ クラス 'SingleValue' しか生成されません。

%rename を試してみましたが、生成されるプロキシ クラスは 3 つではなく 1 つだけです。

4

1 に答える 1

1

あなたが達成しようとしているのは、強力なタイピングのようです。デフォルトでは、SWIG は C++ で見られるのと同じ動作でインターフェイスを公開しようとします。したがって、その場合の動作は予想されます - 弱い typedef はすべて 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(); }

これは、テスト用の2つのインライン関数の修正と追加のみがあなたのものと異なります。次のよう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の 1 つは、クラスであるため、強力な typedef が Java 型システムのサブクラスになり、チェックを強制できるためです。型がクラスでない場合でも、継承を使用せずに同じことを行うことができます。たとえば、 D を使用して同様の問題について私が与えた回答の最初の部分が機能します。継承はありません。

于 2012-11-11T16:44:19.840 に答える