如何使用 std::max 或 std::min 作为函数参数
How to use std::max or std::min as function parameter
我喜欢将 std::max
或 std::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>);
将起作用
我喜欢将 std::max
或 std::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>);
将起作用