C++ 可变lambda与可变模板函数:严格等效?
考虑一下这个代码片段C++ 可变lambda与可变模板函数:严格等效?,c++,C++,考虑一下这个代码片段 #include <chrono> auto wrapAndCallLambda = [] (auto fn, auto &&... params) { const auto start = std::chrono::system_clock::now(); auto result = fn(std::forward<decltype(params)>(params)...); const auto end
#include <chrono>
auto wrapAndCallLambda =
[] (auto fn, auto &&... params)
{
const auto start = std::chrono::system_clock::now();
auto result = fn(std::forward<decltype(params)>(params)...);
const auto end = std::chrono::system_clock::now();
const auto elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << "s";
return result;
};
template <typename Fn, typename... Args>
auto wrapAndCall(Fn fn, Args &&... params)
{
const auto start = std::chrono::system_clock::now();
auto result = fn(std::forward<decltype(params)>(params)...);
const auto end = std::chrono::system_clock::now();
const auto elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << "s";
return result;
}
#包括
自动包装CallLambda=
[](自动fn、自动和…参数)
{
const auto start=std::chrono::system_clock::now();
自动结果=fn(标准::正向(参数)…);
const auto end=std::chrono::system_clock::now();
常量自动运行=结束-开始;
std::coutwrapAndCallLambda
是一个实际对象,而wrapAndCall
是一个模板
这意味着您可以将wrapAndCallLambda
直接传递给其他函数,并且您必须显式地传递&wrapAndCall
,或者将其包装到另一个lambda中,该lambda转发其参数
这也意味着您不能重载或专门化wrapAndCallLambda
,但您可以轻松地为wrapAndCall
编写另一个重载
您也无法通过ADL找到wrapAndCallLambda
。这可能是您想要的功能。w.r.t.“显式传递”-在这种情况下,您实际上并没有传递lambda对象,而是传递一个指向(实例化)方法转换为的函数的指针,对吗?如果是,这是否意味着它只适用于无CaptureLambda?