C++ 将lambda传递给模板函数
我有以下代码:C++ 将lambda传递给模板函数,c++,templates,lambda,C++,Templates,Lambda,我有以下代码: 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(
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();
}
模板
双重测量(L和行动)
{
使用名称空间std::chrono;
高分辨率时钟:时间点开始、结束;
持续时间跨度;
开始=高分辨率时钟::现在();
动作();
end=高分辨率时钟::现在();
timeSpan=持续时间(结束-开始);
返回timeSpan.count();
}
我是这样用的:
cout << measure([](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
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();
}
cout你可以有这样的东西:
cout << measure([](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
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();
}
模板
// ^^^^^^^^^^^^^^^^
双重测量(L和行动)
{
使用名称空间std::chrono;
自动启动=高分辨率时钟::现在();
动作();
自动结束=高分辨率时钟::现在();
自动时间跨度=持续时间(结束-开始);
// ^^^^^^^^^^^^^^^^^^^^^^^
返回timeSpan.count();
}
首先,传递lambda函数的标准方法是使用std:function
:
#include <functional>
...
double measure( std::function<void()> action ){
...
}
#包括
...
双重测量(标准::功能动作){
...
}
然后用你使用的方法使用它
cout << measure([&](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
cout模板参数std::ratio
如何在measure
中准确使用?函数的最后第二行是timeSpan=duration\u cast(end-start)代码>g++在我尝试此操作时给出了一个很长的错误输出。再次尝试检查我是否键入了错误的内容,但no.g++基本上会抱怨:注意:模板参数推断/替换失败:
@pedroverneti。如果您忘记使用measure
更新对measure
的调用,则听起来像是一个错误。否。事实并非如此。我完全按照我的建议键入了。@Pedroverneti您能提供一个关于此错误的说明吗?在缩短代码以向您展示的同时,我意识到持续时间\u cast<…
中缺少了一个'>'。当你说我可能忘了更新调用时,我只检查了调用.“标准”即存储lambda函数的推荐方法是std::function
。相反,在传递时,在接收端使用函数模板更为优越,因为这样做可以避免增加std::function
。。。它本身就是一个模板,但是有一堆额外的膨胀来启用类型擦除,在本例中不需要这样做。看见