【发布时间】:2020-09-02 06:12:57
【问题描述】:
我的理解是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;
}
令我惊讶的是,这不会编译,因为,
'': 不能从 'const 转换 std::shared_ptrstd::greater_equal
' 到 'std::shared_ptr<:function>>'
我不知道为什么,
我需要的是类似于上面sn-p中的精神,我将有一个成员字段,std::shared_ptr<std::function<bool (double, double)>>,我需要根据某些条件分配<greater_equal<double>或less_equal<double>,我应该如何实现这一点?
【问题讨论】:
-
那里有什么令人惊讶的地方?它是一种重载
operator()的类型,它不能隐式转换为std::function。如果这是您想要做的,您需要一个 lambda。如果您知道实际的咒语,重载的运算符可能是可转换的,但对象本身不是 lambda。 -
@TanveerBadar 为什么不能兑换?它是(即该类型的一个实例)。 OP 只是做错了。
-
@HolyBlackCat 让我感到惊讶。 :) 如果它应该是可转换的,那么这可能是 OP 正在使用的编译器的问题。或者那个。
-
请注意,这里的问题出在
shared_ptr。您可以将std::greater_equal存储到std::function<bool(double, double)>。但是在shared_ptr构造/分配中,您只能使用具有compatible pointers 的对象,这不是您的情况。 -
@TanveerBadar 它是可转换的,因为
std::function具有相应的(非显式)转换构造函数。你可以轻松写std::function<bool(double, double)> f = std::greater_equal<double>{};。
标签: c++ c++11 std-function