将lambda传递给模板函数
Passing lambda to template function
我有以下代码:
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
。
相关文章:
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda