2

SWIGは、渡されたuserdataオブジェクトのデータ型の文字列表現を取得するためのswig_type()関数を丁寧に提供します。ただし、メンバーフィールドの場合、SWIGとLuaはそれらを単純な「数値」アイテムと見なすため、データ型の名前ではなく「数値」のみを出力します。

例えば

typedef num_years int;

class Person
{
    public:
           Person * spouse;
           num_years   age;
};

C ++では、次のようになります。

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

> p = MyModule.Person();
> print(swig_type(p.spouse));
Person *
> print(swig_type(p.age));
number

メンバーフィールドのデータ型を判別するために使用できるバックドアルートはありますか?引数を検証するときに、get関数とset関数が数値フィールドの正しい文字列表現を持っていることがわかります。

助けてくれてありがとう!

4

2 に答える 2

3

SWIG でラップされた C++ オブジェクトは、特定のルール セットに準拠する Lua ユーザーデータ オブジェクトです。 swig_type()これらのユーザーデータ オブジェクトをピアリングし、SWIG がそこに格納した型名情報を取得することによって機能します。しかしage、直接表現されているため、参照するタイプ名フィールドswig_type()がないため、その魔法を行うことはできません. num_years を int をラップする不透明なクラス型にすることで、必要なものを得ることができます (また、C++ での使いやすさのためにいくつかの暗黙的な変換を定義する可能性があります)。

get 関数と set 関数は、まったく異なるメカニズムで機能します。SWIG はコンパイル時に生成されたラッパーに署名を保存し、インターフェイス ファイルからコピーするため、正しい署名を持っています。

于 2009-10-07T20:43:55.227 に答える
0

これが非常に古いことは知っていますが、可能な答えを投げると思います。

次のような構造体で年をラップします。

struct year_t
{
    year_t(int year) : m_year(year) {}
    void operator()(int year) { m_year = year; }
    int operator()() const { return m_year; } 
private:
    int m_year;
}

class Person
{
public:
       Person * spouse;
       year_t age;
};
于 2016-08-04T12:58:46.840 に答える