【问题标题】:Assigning lambda as default parameter to std::function type将 lambda 作为默认参数分配给 std::function 类型
【发布时间】: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 &lt;typename T, typename F = std::less&lt;void&gt;&gt; decltype(auto) find_median(T, T, bool = false, F comp = {}); 似乎更简单。 (并且没有std::function :) 的开销)。
  • 避免std::function,除非您需要将通用函数对象存储在某个数据结构中并稍后调用它。

标签: c++ templates lambda c++20 default-arguments


【解决方案1】:

@jarod42 似乎评论了这里的最佳答案。以下函数签名似乎是最合适的,正如他所指出的,它不会带来 std::function 的开销 template &lt;typename T, typename F = std::less&lt;void&gt;&gt; decltype(auto) find_median(T, T, bool = false, F comp = {});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2013-02-17
    • 2022-01-17
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多