[英]Variadic lambda vs variadic template function : stricly equivalent?
考虑这个代码片段
#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;
}
它是严格等价的吗? 是否有任何考虑因素(与意见和风格无关)指导选择哪一个? 代码膨胀? 表演? 如果广泛使用编译时间?
wrapAndCallLambda
是一个实际的 object,而wrapAndCall
是一个模板。
这意味着您可以将wrapAndCallLambda
直接传递给其他函数,并且您必须显式传递&wrapAndCall<fn_type, arg1, arg2, ...>
,或者将其包装到另一个转发其 arguments 的 lambda 中。
这也意味着您不能重载或wrapAndCallLambda
,但您可以轻松地为wrapAndCall
编写另一个重载。
您也永远无法通过 ADL 找到wrapAndCallLambda
。 这可能是您想要的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.