簡體   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