2009-05-19 18 views
3

私は、クラス数が150 +以上のC++プロジェクトに取り組んでいます。それぞれには10〜300フィールド程度あります。私は本当にテスト用スクリプトインターフェイスを提供して、再コンパイルを必要としないコールバックをコーディングできるようにしたいと考えています。私はLuaでこれをしたいと思っています。なぜなら私はPythonのものよりもC APIをよく知っていますが、それが頭痛を救うのであれば、Pythonでうれしいでしょう。Swig経由でC++とLua間の変数を渡す

私はC++からLua関数を呼び出す方法をしっかりと把握しており、基本データ型を前後に渡す方法を知っています。私が持っている質問は、SWIGを使用して2つの間でユーザー指定のデータ型を共有する方法です。

たとえば、私のC++のある時点で、250のフィールドを持つオブジェクトのメンバーデータをいくつか評価したいと思うかもしれません。そのオブジェクトをLuaに渡して、生成されたSWIGラッパーを使用してそのオブジェクトを操作し、特定のフィールドを表示し、(潜在的に変更された)オブジェクトをC++に渡して継続的に使用できるようにすることができます。

また、ラッパーを使用してオブジェクトのインスタンスをインスタンス化し、それをC++に渡して、オブジェクトの通常のC++バージョンとして使用することもできます。

これは可能ですか?誰かがチュートリアルや明示的な例を教えてくれますか?

ご協力いただきありがとうございます!

答えて

1

Swigインターフェイス(Swig-Lua APIのドキュメントについてはhereを参照)を使用してユーザー定義型をラップする限り、相互作用はシームレスでなければなりません。提供されたSwigラッパーは、新しいオブジェクトをインスタンス化し、C++に渡すことができます。逆もまた同様です。

Swig-Luaラッピングがディレクタークラスをまだサポートしていないと思います。つまり、既存のクラスを拡張してインスタンス化し、C++に戻すことはできません。ディレクターは、Python、Java、C#などの言語でサポートされています。

+0

リンクをいただきありがとうございます。一方通行だけでも大きな助けとなります。 Luaでオブジェクトの新しいインスタンスを作成してC++に渡すことができない場合でも、Luaに渡された既存のC++オブジェクトを変更できるかどうか知っていますか?つまり、C++オブジェクトを作成してLuaに渡し、Luaでいくつかのフィールドを変更してから、C++で更新されたフィールドを使用して再開できますか? – zslayton

+0

はい、もちろんです。 LUAのオブジェクトを(SWIGによって提供されるインタフェースを介して)変更すると、実際には基礎となるC++オブジェクトが変更されます。それはかなりシームレスです。 SWIGは、配列、STL、ポインタ、ファクトリ型関数、演算子ベースのクラスインタフェース(スマートポインタを含む)などの言語機能でも、 – ASk

0

swigが問題を引き起こす場合、私はtolua ++の最新バージョンで幸運を祈っています。これはC++とLuaをバインドする唯一の目的です。それは入力として変更された.hファイルを必要とします。これはちょっと面倒ですが、Swigのモジュールよりもそれほどです。私はもう一方を優先する理由はありませんが、両方について知ることは良いことです。

0

Luabindもチェックしてください。これは、Lua用にOOPを実装し、クラスとデータ型をLuaからC++に戻すことができます。

関連する問題