将lambda传递给模板函数

Passing lambda to template function

本文关键字:函数 lambda      更新时间:2023-10-16

我有以下代码:

template <typename L>
double measure( L&& action )
{
    using namespace std::chrono;
    high_resolution_clock::time_point start, end;
    duration<double> timeSpan;
    start = high_resolution_clock::now();
    action();
    end = high_resolution_clock::now();
    timeSpan = duration_cast<milliseconds>(end - start);
    return timeSpan.count();
}

,我这样使用它:

    cout << measure([](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;

到目前为止,这是我知道的传递lambda函数的唯一方法。但是,我试图使这个函数更完整,允许传递一个比率<>作为模板参数,指定timeSpan模板的比率<>,以毫秒以外的其他度量返回时间…

所以,我想知道如何将多个模板参数传递给函数并一起传递lambda。我应该在模板上指定什么作为lambda的类型,或者我还可以做些什么来实现这样的目标:

    timer::measure<ratio<1,1000>>([](){ mergeSort<float>(array, 0, 10000); })

?

你可以这样写:

template <typename Ratio, typename L>
//        ^^^^^^^^^^^^^^^^
double measure( L&& action )
{
    using namespace std::chrono;
    auto start = high_resolution_clock::now();
    action();
    auto end = high_resolution_clock::now();
    auto timeSpan = duration_cast<duration<double, Ratio>>(end - start);
    //                            ^^^^^^^^^^^^^^^^^^^^^^^
    return timeSpan.count();
}

现场演示

首先,传递lambda函数的标准方式是使用std:function:

#include <functional>
...
double measure( std::function<void()> action ){
    ...
}

然后按照

的方式使用它
cout << measure([&](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;

然后,您可以应用Jefffrey的答案,删除模板参数L