以前我用宏来测量函数调用的时间,每当我想快速检查时.现在,在C++ 11可用的情况下,我想最终删除预处理器代码的丑陋和平,并用以下内容替换它:
template <typename Functor, typename ... Args>
auto measure(Functor f, Args && ... args)
-> decltype(f(std::forward<Args>(args)...))
{
auto now = std::chrono::high_resolution_clock::now();
auto ret = f(std::forward<Args>(args)...);
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now() - now).count();
std::cout << "Time elapsed: " << elapsed << "ms" << std::endl;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
对于返回某些东西(即没有void)的函数,它可以正常工作.所以我觉得我需要为void函数重载- 但是你不能仅仅在返回类型上重载函数.
我尝试使用一些模板魔法来解决这个问题,但无济于事; 编译器仍然抱怨函数measure定义了两次:
template <
typename Functor, typename ... Args,
typename ReturnType = typename std::enable_if<
!std::is_void<
typename std::result_of<Functor(Args...)>::type
>::value,
typename std::result_of<Functor(Args...)>::type
>::type
>
ReturnType measure(Functor f, …Run Code Online (Sandbox Code Playgroud)