2012-03-02 10 views
5

Iは特定の順序で多数回関数のセットを繰り返し、それらの機能に基づいていくつかの計算結果を出力するシミュレーションプログラムを有しています。各関数は何らかの方法でSimulatorオブジェクトを変更し、異なるタイプの引数を可変数使用します。たとえば:C++プログラムがユーザ定義のスクリプトに従う最も良い方法は?

class Simulator 
{ 
    Simulator(); 
    void A(int x, double y, string z); 
    void B(int x, int y); 
    void C(double x); 
}; 

私は、ユーザーがこれらの機能を引数としてだけでなく呼び出される順序を指定できるようにしたい、と私は、スクリプトのいくつかの並べ替えのためにこの情報を保存できるようにする必要があります続くプログラム。たとえば、スクリプトがプログラムの次のアクションに変換される可能性があります。

Simulator mySim; 
mySim.A(5, 6.0, "a string"); 
mySim.B(1, 1); 
mySim.A(3, 4.0, "another string"); 
mySim.C(10.0); 

効率的な方法はありますか?私の最初の考えは、それぞれが関数の名前と引数を格納しているオブジェクトのリンクされたリストを持つことです。プログラムはリストをトラバースし、各関数を順番に呼び出します。しかし、これは問題のカップルを提起:

(a)の方法(量が異なるだけでなく、タイプの両方)機能ごとに異なるものとなるリスト内の引数を格納します。

(b)の私のプログラムを呼び出すために機能するかを決定するために、シミュレーションの実行ごとにif文のシリーズを実行する必要がありますよう、むしろ非効率です。

誰もが何か提案がありますか?

答えて

6

私の提案:自分のスクリプト言語/インタプリタを発明していないが。

あなたがすぐに一日で、ユーザー定義のスクリプトをサポートして始めたい場合は、Luaをチェックしてください。間違いなく、C/C++プログラムに組み込む最も簡単な言語の1つです。 luabindではさらに簡単です。

module(L) 
[ 
    class<Simulator>("Simulator") 
     .def("A", &Simulator::A) 
     .def("B", &Simulator::B) 
     .def("C", &Simulator::C) 
]; 

完了!今度は、シミュレータを作成して関数を呼び出すことができるluaスクリプトを実行し、完全な言語とその基本ライブラリのすべての機能を取得し、各呼び出しで数式を計算し、ユーザー定義の関数、クロージャ、ラムダなどを作成します。 luaはスクリプティング言語に関してはスピードの悪い魔法です。

私は実際には1日にLuaのと完全にスクリプト一つにかなり大規模な、商用C++プログラムを有効にするために管理します。それはそれが行うために設計されて以来、埋め込むのはとても簡単です。

Boost.Pythonを使用するとLuabindに似ているPythonもありますが、C APIにはもっと苦労していますが、少し面倒です(静的にリンクされたライブラリを構築したり、 sys.pathのように対処しなければならない環境変数がたくさんあり、デバッグ/リリース版で正しいPython実装を使用していることを確認してください)。

また、他の言語の中から選択しますが、簡単に多くのことを結合させるためにC++ライブラリを提供しているの私が知っている最も人気のあるもののこれら二つの可能性があります。

また、SWIGは複数のスクリプト言語をサポートしていますが、多くの詳細が記載されている大量のドキュメントがあるため、SWIGは多くの時間がかかります言語。

+0

ありがとうございました。私は非常に簡単なスクリプトを実装することしか考えていないので、LUAを見ていきます。 – JBentley

+0

@JonBentley私はあなたが遠くに行くと思う。 Luaサポートを簡単に組み込むことができるだけでなく、アプリケーションで汎用の組み込みスクリプト言語をサポートする方法を学ぶことで、今後のすべてのプロジェクトで、全く新しいC++ /スクリプトプログラミングの世界を開くことができます。 – stinky472

関連する問題