私は、Io 言語用の C++ バインディング ライブラリである LikeMagic の作成者です。(私は Io の作者ではありません。)
http://github.com/dennisferron/LikeMagic
LikeMagic に関する私の明示的な目標の 1 つは、完全で完全な C++ 相互運用性 (双方向) です。LikeMagic は、ネイティブ Io 型を C++ 型としてマーシャリングし (STL コンテナーと Io のネイティブ List 型の間の変換を含む)、Io 内の C++ クラス、メソッド、フィールド、および配列を表します。Io 環境からIo コードのブロックを渡し、C++ でファンクターとして使用することもできます!!
C++ 型を Io スクリプトで使用できるようにラップするのは、シンプルで迅速かつ簡単です。C++ からスクリプト オブジェクトにアクセスするには、説明したように「eval」関数が必要ですが、テンプレート ベースの型変換とマーシャリングにより、スクリプト文字列の実行結果に簡単にアクセスできます。また、Io block() オブジェクトを C++ ファンクターに変換する前述の機能もあります。
現在、プロジェクトはまだ初期段階ですが、完全に機能しています。ビルド手順と依存関係を文書化するなどの作業をまだ行う必要があります。MSVC でまだサポートされていない C++0x 機能を使用しているため、gcc 4.4.1+ (Microsoft Visual C++ ではない) でのみビルドできます。ただし、Linux と Windows を完全にサポートしており、Mac への移植が計画されています。
ここで悪いニュース: スクリプトで .h ファイルと .so または .dll ファイルを生成して C++ から呼び出し可能にするには、(一種の)コンパイラが必要になるだけでなく、JIT コンパイラも必要になります。これは、(多くのスクリプト言語で、特に Io では) オブジェクトのメソッドとフィールドが実行時までわからないためです。Io では、ライブ オブジェクトにメソッドを追加したり削除したりすることもできます! 最初に、あなたがこれを求めているという事実そのものが、動的言語が何であるかを本当に理解していないのではないかと思います.. しかし、私は、最初に何かを行うための理想的または最も簡単な方法を想像しようとし、そこから実際に可能な方法まで逆算するデザインの方法を信じています. ですから、使いやすさの観点から、あなたが説明した方が使いやすいと思います。
しかし、それは理想的であり、(JIT コンパイルでスクリプト言語を使用して) かろうじて可能ですが、あまり実用的ではないため、あなたが求めているものが本当に欲しいものであるかどうかはまだわかりません. .h および .so/.dll ファイルがスクリプトから JIT され、スクリプトが変更された場合、変更を利用するには C++ プログラムを再コンパイルする必要があります。そもそもスクリプトを使用することの主な利点に違反していませんか?
実用的な唯一の方法は、スクリプトで定義されたインターフェイスが変更されず、スクリプト関数の C++ ラッパーを作成しているだけの場合です。次のような多くの C++ 関数を持つことになります。
int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }
ラッパー関数の呼び出し元の観点から見れば、これがよりクリーンなコードであることは認めます。しかし、それが必要な場合は、スクリプト言語でリフレクションを使用して、スクリプト オブジェクトに格納されているメソッド リストから .h ファイルを生成してみませんか? この種のリフレクションは、 Io で簡単に実行できます。ある時点で、OpenC++ ソースからソースへのトランスレータを LikeMagic の呼び出し可能なライブラリとして統合する予定です。つまり、文字列を書き出す代わりに、堅牢な C++ コード ジェネレータを使用することもできます。