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),但我不确定 typerunWithTime的参数应该是什么。

任何帮助都会很棒!提前致谢。

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)您向它传递了一个指向函数的指针,这是f参数,但您没有提供g,所以您不能调用f(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)
}

现在应该很明显,您需要将两个参数传递给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 回答