考虑一下此代码段
#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
是实际对象,而是wrapAndCall
模板。
这意味着您可以wrapAndCallLambda
直接传递给其他函数,并且必须显式传递&wrapAndCall<fn_type, arg1, arg2, ...>
或将其包装到另一个lambda中,以传递其参数。
这也意味着您不能重载或专门化wrapAndCallLambda
,但是您可以轻松编写另一个重载wrapAndCall
。
您也永远无法wrapAndCallLambda
通过ADL查找。这可能是您想要的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句