繁体   English   中英

Variadic lambda vs variadic template function:严格等效?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM