在 C++ 中 greater_equal<double> 有一种函数类型 <bool (double, double)>

In c++ does greater_equal<double> have a type of function<bool (double, double)>

我的理解是 greater_equal<double> 是一个签名为 function<bool (double, double)> 的仿函数,所以我尝试执行以下操作,

#include <functional>
#include <memory>

using namespace std;

int main() {
    std::shared_ptr<std::function<bool (double, double)>> f;
    auto f1 =make_shared<greater_equal<double>>();
    auto f2 = make_shared<less_equal<double>>();
    f = f1;
}

令我惊讶的是,这不会编译,因为,

'': cannot convert from 'const std::shared_ptrstd::greater_equal<double>' to 'std::shared_ptr<std::function<bool (double,double)>>'

我不知道为什么, 我需要的是类似于上面代码片段中的精神,我将有一个函数成员字段,std::shared_ptr<std::function<bool (double, double)>>,我需要根据某些条件分配 <greater_equal<double>less_equal<double>,如何我应该实现这个吗?

如果 std::greater_equal<double>std::less_equal<double> 继承自 std::function<bool(double, double)>,那么您编写的内容将有效,但他们不会这样做。

但是由于 std::function<bool(double, double) 可以从 std::greater_equal<double>(和 less_equal)的实例构造,您可以改为这样做:

auto f1 = std::make_shared<std::function<bool(double, double)>>(std::greater_equal<double>{});

但我不认为你首先想要 std::function

greater_equal<double> is a functor that has a signature of function<bool (double, double)>

是的,它的 operator()(double, double) 参数和 returns bool,但它与 std::function.

无关

std::function 是一个包装器 class,可以存储它认为可调用的任何对象。它接受签名的细微变化(例如,即使 less/greater_equal 通过 const 引用接受参数,并且您告诉 std::function 参数应该按值传递,它仍然有效),并且它可以存储具有状态的对象(与数据成员)。这些功能来自 with an overhead.


根据

判断

I need to assign either greater_equal<double> or less_equal<double> base on some condition

您需要 none 这些 std::function 功能。

您可以使用函数指针(它需要签名完全匹配,并且不能存储任何状态):

bool (*ptr)(double, double) = [](double a, double b)
{
    return a <= b;
};