很抱歉这个冗长且混乱的标题!这是我的问题:我正在尝试编写一个函数来输出另一个函数所需的时间。通常我只是传递函数及其参数,但在这个例子中,我试图计时的函数将函数作为参数。
对于一个具体的例子,我试图让它工作:
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
的参数应该是什么。
任何帮助都会很棒!提前谢谢。
答案 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");