2

この質問を投稿しました。SpongeBobFan答えは反射だと言いました。Boost.Reflectを見つけて、そのライブラリまたは別の C++ リフレクション ライブラリを使用してこれをどのように実現できるのか疑問に思っていました。コードをちらっと見て、何が起こっているのかを理解することはできないので、あなたの答えを説明してください。私の質問はこれでした:

わかりました、質問があります。このコードがあるとします:

int myfunc(int arg-a, int arg-b);
int mywrapperfunc(obj a, obj b);

mywrapperfuncラップすることになっていmyfuncます。mywrapperfunc最初の引数を破棄し、配列である 2 番目の引数を取ります。次に、配列項目をパラメーターとして使用します。しかし、引数の数がわからないmyfunc、または配列型オブジェクト ( b) に含まれるアイテムの数がわからないと言います。myfunc正しい数の引数を使用してプログラムで呼び出すにはどうすればよい ですか? 渡される引数の数は、配列型オブジェクトの項目数と同じになります。

EDIT:配列型オブジェクトarg-aからarg-b来るはずです。オブジェクトを引数に分割します。

編集:わかりました、わかりました、Python C API をいくつかの意味でラップして、ほとんどのバックグラウンド ジョブを非表示にしようとしています。

4

3 に答える 3

3

Reflexを見たことがありますか?このツールは、GCC-XMLを使用して、Java のものと同様のリフレクション ライブラリを作成します。

これが私の最初の見解です(現在、それをさらに洗い流すための自由時間があまりありません):

// Use the Reflex library to look up "myfunc" reflectively
Type t = Type::ByName("myfunc");
// The Reflex type 'Type" has a "FunctionParameterSize()" that tells
// you how many args in a function
size_t num_params = t.FunctionParameterSize();
// Use this information to call "myfunc" with objects from "b"

Reflex がクラスのメンバーに対してのみ呼び出し機能を提供する場合はmyfunc()、静的クラス メンバーを作成して、次のようなことを試すことができます。

// Load MyClass reflectively (where MyClass contains a static member function "myfunc")
Type t = Type::ByName("MyClass");
// Find the member function "myfunc"
Member m = t.MemberByName("myfunc");
// Pack the parameters from "b" into a vector
// (Assumes "b" has indexing operators, and a "length()" function)
std::vector params(&b[0], &b[b.length()-1]);
// Invoke the method "myfunc" reflectively
m.Invoke(params);

これをいじる必要があります。パラメーターの受け渡しが正しく行われているかどうかはわかりませんが、新しいアイデアが得られることを願っています。

于 2013-04-15T16:59:18.233 に答える