【问题标题】:In c++ does greater_equal<double> have a type of function<bool (double, double)>在 c++ 中,greater_equal<double> 是否有一种 function<bool (double, double)>
【发布时间】:2020-09-02 06:12:57
【问题描述】:

我的理解是greater_equal&lt;double&gt;是一个签名为function&lt;bool (double, double)&gt;的函子,所以我尝试执行以下操作,

#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;
}

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

'': 不能从 'const 转换 std::shared_ptrstd::greater_equal' 到 'std::shared_ptr<:function>>'

我不知道为什么, 我需要的是类似于上面sn-p中的精神,我将有一个成员字段,std::shared_ptr&lt;std::function&lt;bool (double, double)&gt;&gt;,我需要根据某些条件分配&lt;greater_equal&lt;double&gt;less_equal&lt;double&gt;,我应该如何实现这一点?

【问题讨论】:

  • 那里有什么令人惊讶的地方?它是一种重载operator() 的类型,它不能隐式转换为std::function。如果这是您想要做的,您需要一个 lambda。如果您知道实际的咒语,重载的运算符可能是可转换的,但对象本身不是 lambda。
  • @TanveerBadar 为什么不能兑换?它是(即该类型的一个实例)。 OP 只是做错了。
  • @HolyBlackCat 让我感到惊讶。 :) 如果它应该是可转换的,那么这可能是 OP 正在使用的编译器的问题。或者那个。
  • 请注意,这里的问题出在shared_ptr。您可以将std::greater_equal 存储到std::function&lt;bool(double, double)&gt;。但是在shared_ptr 构造/分配中,您只能使用具有compatible pointers 的对象,这不是您的情况。
  • @TanveerBadar 它是可转换的,因为std::function 具有相应的(非显式)转换构造函数。你可以轻松写std::function&lt;bool(double, double)&gt; f = std::greater_equal&lt;double&gt;{};

标签: c++ c++11 std-function


【解决方案1】:

如果std::greater_equal&lt;double&gt;std::less_equal&lt;double&gt; 继承自std::function&lt;bool(double, double)&gt;,你写的内容会起作用,但他们不会这样做。

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

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

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

greater_equal&lt;double&gt; 是一个具有function&lt;bool (double, double)&gt; 签名的函子

是的,它的operator()(double, double) 参数并返回bool,但它与std::function 无关。

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


判断

我需要根据某些条件分配greater_equal&lt;double&gt;less_equal&lt;double&gt;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多