基于传递的 lambda 的返回类型的模板专业化 - C++

问题描述 投票:0回答:0

我正在尝试根据它作为参数获取的 lambda 函数的返回类型进行模板专业化。 目标是拥有一个函数,我可以将 lambda(或其他函数,如果可能)传递给该函数,让该函数测量该 lambda 的运行时间并返回 lambda 结果。当 lambda 没有返回值(void)时,问题就来了。

现在我使用两个函数,一个用于 void 返回类型,第二个用于所有其他返回类型。

template <typename F, typename ... Args>
static void measured_run(double& time, F f, Args&&...args)
{
    auto start = boost::posix_time::microsec_clock::local_time();
    f(std::forward<Args>(args)...);
    auto end = boost::posix_time::microsec_clock::local_time();
    time += (end - start).total_milliseconds();
}


template <typename F, typename ... Args>
static auto measured_run_ret_val(double & time, F f, Args&&...args) -> decltype(f(std::forward<Args>(args)...))
{
    auto start = boost::posix_time::microsec_clock::local_time();        
    auto result = f(std::forward<Args>(args)...);    
    auto end = boost::posix_time::microsec_clock::local_time();
    time += (end - start).total_milliseconds();        
    return result;
}

我希望能够像这样使用它:

double time;
measured_run(time, []() {return false; });
measured_run(time, []() {printf("void\n"); });

现在我正在使用 c++14,但如果 17/20 有解决方案,我也会很好奇。

感谢您的任何建议。

c++ templates lambda specialization
© www.soinside.com 2019 - 2024. All rights reserved.