3

長くて紛らわしいタイトルでごめんなさい!これが私の問題です。別の関数にかかる時間を出力する関数を作成しようとしています。通常は関数とその引数を渡すだけですが、この場合、時間を計ろうとしている関数は関数を引数として受け取ります。

具体的な例として、これを機能させようとしています。

void foo(void (*f) (T*)){
  ...function stuff...
}

                  --------not sure what this should be
                 | 
void runWithTime(void (*f) (void (*g) (T*))){
  f(g)
}

//runWithTime(foo);

を呼び出せるようにしたいのですrunWithTime(foo)が、型runWithTimeの引数がどうあるべきかわかりません。

どんな助けでも素晴らしいでしょう!前もって感謝します。

4

3 に答える 3

5

簡単な解決策:

template<typename T>
auto runWithTime0(T _func) -> decltype(_func())
{
  startTimer();
  _func();
  endTimer();
}

template<typename T, typename P1>
auto runWithTime1(T _func, P1 _arg1) -> decltype(_func(_arg1))
{
  startTimer();
  _func(_arg1);
  endTimer();
}

// ...etc

boost :: bindで同様のことを行うことができますが、それが利用できない場合は、上記でうまくいくはずです。

編集:戻り値を追加しました。これは、コンパイラがc ++ 11(VC2010 / 2012、g ++ 4.7以降をサポートしていると思います)をサポートしている場合に機能します。

于 2013-03-19T21:04:08.513 に答える
2

呼び出すときは、パラメーターでrunWithTime(foo)ある関数へのポインターを渡しますが、指定していないため、呼び出すことはできません...それはどういう意味ですか?fgf(g)

あなたの人生をよりシンプルにするために、いくつかのtypedefを使用してください:

// A pointer to a function that takes a single T* argument
typedef void (*func_ptr)(T*);

void foo(func_ptr f){
  ...function stuff...
}

// A pointer to a function that takes a single func_ptr argument
typedef void (*funcfunc_ptr)(func_ptr);

void runWithTime(funcfunc_ptr f, func_ptr g){
  f(g)
}

これで、 2つの引数をに渡す必要があることは明らかですrunWithTime。たとえば、署名付きの関数はどこにありますrunWithTime(foo, NULL)runWithTime(foo, bar)barvoid bar(T*)

于 2013-03-19T21:12:31.597 に答える
1

たまたま、私は半最近、ほぼ同じ目的でいくつかのコードを書きました。私が思いついたのはこれでした:

template <class F, class T>
void timer(F f, T &t, std::string const &title) { 
    unsigned count;
    clock_t start = clock();
    result = f(t, 'N');
    clock_t stop = clock();
    std::cout << std::left << std::setw(30) << title << "\tResult: " << result;
    std::cout << "\tTime: " << double(stop-start)/CLOCKS_PER_SEC << "\n";
}

使用は次のようでした:timer(function1, infile, "Running function 1");

于 2013-03-19T21:10:19.480 に答える