我有以下代码:
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函数的唯一方法。但是,我试图使这个功能更完整,允许通过一个比率&lt;&gt;作为模板参数,指定比率&lt;&gt; timeSpan模板,以毫秒为单位返回时间......
所以,我想知道如何将多个模板参数传递给函数并将lambda传递到一起。我应该在模板上指定什么作为lambda的类型,或者我还能做些什么来实现这样的目标:
timer::measure<ratio<1,1000>>([](){ mergeSort<float>(array, 0, 10000); })
答案 0 :(得分:4)
你可以这样:
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();
}
答案 1 :(得分:-4)
首先,传递lambda函数的标准方法是使用std:function
:
#include <functional>
...
double measure( std::function<void()> action ){
...
}
然后以与使用
相同的方式使用它cout << measure([&](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
然后,您可以通过删除模板参数L
来应用Jefffrey的答案。