【发布时间】:2021-12-27 06:19:45
【问题描述】:
对于以下功能:
template<typename T>
decltype(auto) find_median(
T begin,
T end,
bool sorted = false,
const std::function<bool()> comparison = [](auto a, auto b)->bool{return a < b;})
{
assert(begin != nullptr);
assert(end != nullptr);
return sorted ? find_median_sorted(begin, end) :
find_median_unsorted(begin, end, comparison);
}
如果没有明确指定一些 comparison 参数,我无法调用此函数,即使我设置了默认值。所以我必须这样称呼它:
find_median(std::addressof(a[0]), std::addressof(a[9]), true, [](){return 1;} );
而不是能够将其称为
find_median(std::addressof(a[0]), std::addressof(a[9]), true);
这是为什么呢?
【问题讨论】:
-
template <typename T, typename F = std::less<void>> decltype(auto) find_median(T, T, bool = false, F comp = {});似乎更简单。 (并且没有std::function:) 的开销)。 -
避免
std::function,除非您需要将通用函数对象存储在某个数据结构中并稍后调用它。
标签: c++ templates lambda c++20 default-arguments