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