【问题标题】:Variadic lambda vs variadic template function : stricly equivalent?可变参数 lambda 与可变参数模板函数:严格等价?
【发布时间】:2020-11-11 21:47:11
【问题描述】:

考虑一下这段代码sn-p

#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;
 }

是否严格等价?是否有任何考虑(与观点和风格无关)指导选择哪一个? 代码臃肿? 表演? 如果广泛使用,编译时间?

【问题讨论】:

    标签: c++


    【解决方案1】:

    wrapAndCallLambda 是一个实际的对象,而wrapAndCall 是一个模板。

    这意味着您可以将wrapAndCallLambda 直接传递给其他函数,并且您必须显式传递&amp;wrapAndCall&lt;fn_type, arg1, arg2, ...&gt;,或者将其包装到另一个转发其参数的lambda 中。

    这也意味着您不能重载或专门化 wrapAndCallLambda,但您可以轻松地为 wrapAndCall 编写另一个重载。

    您也永远无法通过 ADL 找到 wrapAndCallLambda。这可能是您想要的功能。

    【讨论】:

    • w.r.t. “显式传递” - 在这种情况下,您实际上并没有传递 lambda 对象,而是(实例化)方法转换为的指向函数的指针,对吧?如果是这样,这是否意味着它仅适用于无捕获 lambda?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多