如何使用 std::max 或 std::min 作为函数参数

How to use std::max or std::min as function parameter

我喜欢将 std::maxstd::min 传递给函数。可以这样写代码

函数的定义

void foo (std::function<double(double, double)> extreme) {
    ...
    const double e = extreme(rhs, lhs);
    ...
}

On 可以使用 lambda 调用函数

foo([](const double rhs, const double lhs) { return std::max(rhs, lhs); });

这很丑陋。我更喜欢这样写代码

foo(std::max);

这不是 compile。这或更易读的东西可能吗?

以下作品:

void foo (std::function<double const&(double const&, double const&)>) {}
void foo2 (double const&(double const&, double const&)){}

int main () {
    foo((double const&(*)(double const&, double const&))(std::max<double>));
    foo2(std::max<double>);
}

请注意,我们始终需要使用 std::max<double>

在对 foo 的调用中,因为它需要一个 std::function,编译器没有好的方法可以计算出要使用哪个重载版本的 std::max,因此您需要将其转换为正确的类型。

对于第二个,由于 foo2 采用原始函数,因此它可以正常工作。

请注意,我已明确使用 double const&,因为 std::max 的普通 T 版本(因为没有 const&)采用初始化列表,并且所以无法将其转换为您需要的内容。

因此,要使其与所写的 foo 一起使用,您必须使用 lambda 或重载或某种包装器。

所以最简单的方法是使用上面关于什么有效的知识,并添加一个重载:

void foo(double const&(*func)(double const&, double const&) )
{
    foo([&func](double a, double b){return func(a, b);});
}

然后 foo(std::max<double>); 将起作用