1

次の「関数プロキシ」を作成したい:

  1. 関数オブジェクトです。
  2. 戻り値の型と引数の型は、特定の「基本」関数型からテンプレート引数として自動的に「継承」されます。「基本」関数タイプは、(関数ポインタ / ブースト::関数 / ブースト::バインド) のいずれかです。
  3. 指定された型の関数オブジェクトで初期化されます。
  4. 呼び出されると (元の関数を呼び出すことができるため)、呼び出しを boost::bind のようなものに格納し、それを別の場所 (意図的にスレッドセーフなキュー) に渡して呼び出すことができます。後で、別のスレッドで)、呼び出しの結果を返します。

そして今のところ、私の問題は、テンプレート teq を使用してこの (ファンクター) クラスを作成し、未知の引数リストをバインドに渡す方法 (そしてそれは可能でしょうか) です。

前もって感謝します。

4

1 に答える 1

2
template<typename R, typename... ARGS>
class Proxy {
  typedef std::function<R(ARGS...)> Function;
  Function f;
 public:
  Proxy(Function _f) : f(_f) {}
  R operator(ARGS... args) {
    std::function<R> bound = std::bind(f, args...);
    send_to_worker_thread(bound);
    wait_for_worker_thread();
    return worker_thread_result();
  }
};

// Because we really want type deduction
template<typename R, typename... ARGS>
Proxy<R,ARGS...>* newProxy(R(*x)(ARGS...)) {
  return new Proxy(std::function<R,ARGS...>(x);
}

私は実際にこれをテストしていません。

おそらく非同期のものが必要になるでしょうが、それはあなたに任せます。

于 2013-03-22T04:55:30.217 に答える