C++ 在c++;大_是否等于<;双倍>;具有某种类型的功能<;bool(双人,双人)>;

C++ 在c++;大_是否等于<;双倍>;具有某种类型的功能<;bool(双人,双人)>;,c++,c++11,std-function,C++,C++11,Std Function,我的理解是,greater_equal是一个具有函数签名的函子,因此我尝试执行以下操作: #include <functional> #include <memory> using namespace std; int main() { std::shared_ptr<std::function<bool (double, double)>> f; auto f1 =make_shared<greater_equal<

我的理解是,
greater_equal
是一个具有
函数
签名的函子,因此我尝试执行以下操作:

#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;
}
#包括
#包括
使用名称空间std;
int main(){
std::共享的ptr f;
自动f1=使_共享();
自动f2=使_共享();
f=f1;
}
令我惊讶的是,这不会编译,因为

'':无法从'const'转换 std::shared_ptrstd::大于等于 'std::共享\u ptr'

我不知道为什么,
我需要的与上面代码片段中的精神类似,我将有一个函数的成员字段,
std::shared_ptr
,我需要分配
如果
std::greater_equal
std::less_equal
继承自
std::function
,那么你所写的内容将起作用,但它们不会这样做


但是既然
std::function有什么好惊讶的呢?它是一种重载
运算符()
的类型,不能隐式转换为
std::function
。如果你想这么做的话,你需要一个兰姆达。如果您知道实际的咒语,重载运算符可能是可转换的,但对象本身不是lambda。@TanveerBadar为什么不能转换?它是(即该类型的实例)。OP只是做得不对。@HolyBlackCat颜色让我很惊讶。:)如果它应该是可转换的,那么这可能是OP使用的编译器的问题。注意这里的
shared\ptr
有问题。您可以将
std::greater_equal
存储到
std::function
中。但是在
shared\u ptr
construction/assignment中,您只能处理具有的对象,这不是您的情况。@TanveerDar它是可转换的,因为
std::function
具有相应的(非显式)转换构造函数。您可以轻松地编写
std::function f=std::greater_equal{}
auto f1 = std::make_shared<std::function<bool(double, double)>>(std::greater_equal<double>{});
bool (*ptr)(double, double) = [](double a, double b)
{
    return a <= b;
};