1

私は新しいプラットフォームに取り組んでおり、私のコードは次のとおりです。

レイヤー1:

Call_To_Layer2 (param1, param2);

レイヤー2:

Call_To_Layer2(param1, param2)
{
    Dispatch_Work_To_Thread(param1, param2);
}

Dispatch_Work_To_Thread(param1, param2)
{
    // create a new thread and execute the task
}

Layer1 からの関数呼び出しには、任意の数のパラメーターを指定できます。では、Layer2 でそのようなメソッドを設計するにはどうすればよいでしょうか? layer2 の Dispatch_Work_To_Thread メソッドには、パラメーターの 1 つとして関数名が必要です。パラメータの数は一定ではないため、これをどのように設計できますか?

この問題の設計について熟考しましたが、今まで解決策を思いつきませんでした。

4

4 に答える 4

1

1 つのオプションはCall_To_Layer2、 をDispatch_Work_To_Thread取得しstd::function<void(void)>て、任意の関数名とパラメーターから関数オブジェクトを作成することです。

Layer1 関数:

void foo_layer1(param1, param2);
void bar_layer1(param1, param2);

レイヤー 2:

#include <functional>

Call_To_Layer2 (std::function<void(void)> f); // or reference_wrapper to std::function

f00 = std::bind(foo_layer1, param1, param2);
Call_To_Layer2(foo);  // passes it on to `Dispatch_Work_To_Thread`

必要な C++11 サポートがない場合は、代わりにboost.functionboost.bindを使用できます。

于 2012-10-03T05:55:55.110 に答える
0

これは、C++ で移植可能に実行できるものではありません。ただし、少し変更して、関連するすべてのパラメーターを含むマップである単一のパラメーターを関数が受け入れるようにすることができます。

typedef std::map<std::string, Anything> Parms;

Anything function1(const Parms& parms)
{
    double x = parms("x");
    std::string title = parms("title");
    ...
}

void init_module()
{
    register_function("function1", function1,
                      "void return, double x, string title");
}

上記の例Anythingは、パラメーターまたは戻り値としてサポートする任意の型を含むことができるクラスです。私は自分でコーディングすることに慣れていますが、おそらくそれで問題ありませんboost::any。公開されたすべての関数は、パラメーターの辞書のみを受け入れ、関数は戻り値の型とパラメーターも公開します。この情報は、ディスパッチとパラメータ チェックのためにマップに格納されるため、すべての関数でコード チェックを行う必要がなく、ディレクトリ サービスを公開することもできます。

公開されたサービスの関数の代わりに、"call" メソッドを実装するクラスのインスタンスを使用することもできます (これは私が慣れている方法です)。

残念ながら、C++ 設計はこのユース ケースとあまり互換性がなく、多くのコーディングが必要です。関数名とパラメーターが実行時に提供される「これらのパラメーターを渡すこの名前で関数を呼び出す」ようなものはありません。

一方、この使用はそれほど珍しいことではないことに注意してください。したがって、このダイナミシティを C++ に追加しようとする多くのライブラリを見つけることができます...それらが正確な問題にどのように適合するか、どのような依存関係があり、どのように複雑であるか考慮しなければならないもの。

于 2012-10-03T06:00:08.173 に答える
0
  1. たぶん、すべてのパラメータを構造体またはクラスに入れ、オブジェクトをに渡しますCall_To_Layer2か? これは、クラスが変数因子をカプセル化できる場合に機能します。

  2. もう 1 つのオプションは、可変個引数の関数構文を使用することCall_To_Layer2(param1, param2, ...)です。

于 2012-10-03T05:38:12.903 に答える
0

より具体的な例がなければ、最善の解決策を知ることは困難です。

可変個引数関数は 1 つのオプションかもしれませんが、最近はほとんど時代遅れと見なされています。

最も簡単な方法は、単に引数を astd::vectorなどでラップし、レイヤー 2 コードで適切にアンパックすることです。

于 2012-10-03T05:50:38.693 に答える