我正在寻找一种方法将函数A()作为函数B()的参数传递,以便计算A()的运行时间。
例如:
double timer(<passing function A>) {
clock_t before = clock();
<calling function A - not caring about what it returns>;
clock_t after = clock();
return (double) (before - after) / (double) CLOCKS_PER_SEC;
}
我的问题是我有许多不同的函数可以测试(做同样的工作)具有不同的返回类型和不同的签名。我不知道如何正确设置上一个示例的字段,因为我遇到了转换错误。
答案 0 :(得分:2)
您可以使用模板:
template <typename A>
double timer(const A a) {
...
a();
...
}
答案 1 :(得分:0)
这很简单。
template< class Func >
auto timer( Func const a )
-> double
{
// ...
}
答案 2 :(得分:0)
一个解决方案是将函数包装在仿函数中,并使用函子的实例来调用计时器。
template <typename F>
double timer(F f) {
clock_t before = clock();
f();
clock_t after = clock();
return (double) (before - after) / (double) CLOCKS_PER_SEC;
}
int foo(double a)
{
return (int)(a*a);
}
// foo cannot be used directly as a parameter to timer.
// Construct a functor that wraps around foo.
// An object of FooFunctor can be used as a parameter to timer.
struct FooFunctor
{
FooFunctor(double a) : a_(a) {}
void operator(){res_ = foo(a_);}
double a_;
int res_;
};
bool bar(double a, double b)
{
return (a<b);
}
// Similar to foo and FooFunctor.
// Construct a functor that wraps around bar.
// An object of BarFunctor can be used as a parameter to timer.
struct BarFunctor
{
BarFunctor(double a, double b) : a_(a), b_(b) {}
void operator(){res_ = foo(a_, b_);}
double a_;
double b_;
bool res_;
};
void test()
{
FooFunctor f(10.0);
std::cout << "Time taken: " << timer(f) << std::endl;
BarFunctor b(10.0, 20,0);
std::cout << "Time taken: " << timer(b) << std::endl;
}