如何声明一个函数将函数作为参数?

时间:2013-03-19 20:56:24

标签: c++ time function-pointers

很抱歉这个冗长且混乱的标题!这是我的问题:我正在尝试编写一个函数来输出另一个函数所需的时间。通常我只是传递函数及其参数,但在这个例子中,我试图计时的函数将函数作为参数。

对于一个具体的例子,我试图让它工作:

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的参数应该是什么。

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

3 个答案:

答案 0 :(得分: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或更高版本,我相信),这将起作用

答案 1 :(得分: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)其中bar是带有签名的函数void bar(T*)

答案 2 :(得分: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");