Ric*_*cio 1 c c++ design-patterns callback argument-passing
我正在考虑做一个take_timing函数,它将获取传递给它的任何函数的时间。对于任何函数来说,这都意味着调用者不知道该回调所采用的参数。它也需要回调的参数。但由于它不知道如何调用它,因此需要另一个回调函数,即回调的调用者,由函数用户编写。存根将是这样的:
void take_timing(
void (*callback)(),
void (*caller(void (*callback)(),void* args_struct),
void* args_struct
)
{
// Start timer
caller(callback,args_struct);
// Stop timer, read timings, record...
}
void some_caller(void (*callback)(),void* args_struct)
{
// Cast "callback" to function signature
// Cast args_struct to some struct with args
// Call the callback with correct args signature
}
Run Code Online (Sandbox Code Playgroud)
我的问题来了:
take_timing还是针对每个具体情况都做一个更好?我自己放弃了这个,但出于好奇把它放在这里,也许是一些非常有用的见解。
只需将函子作为模板参数即可。就像是:
template<typename F>
nanoseconds take_timing(F f) {
auto start = high_resolution_clock::now();
f();
auto end = high_resolution_clock::now();
return end - start;
}
long long factorial(int i);
take_timing( [](){factorial(20);} ); // wrap call to function taking arguments in zero-argument lambda
Run Code Online (Sandbox Code Playgroud)