使用C+时出错+;20多态性Lambda函数 我试图通过C++中的lambda编写一个高阶函数,得到这个代码。 void ProcessList::SortCol(std::string col,bool标志){ 自动CmpGenerator=[&] (标准::函数func){ 返回(标志?[&](常量进程&a、常量进程&b){ 返回func(a)func(b);} ); }; std::函数cmp; 如果(列=“PID”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetPid(); }); } else if(列=“CPU”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetRatioCPU(); }); } else if(列==“命令”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetCmd(); }); } 排序(lst.begin(),lst.end(),cmp); }

使用C+时出错+;20多态性Lambda函数 我试图通过C++中的lambda编写一个高阶函数,得到这个代码。 void ProcessList::SortCol(std::string col,bool标志){ 自动CmpGenerator=[&] (标准::函数func){ 返回(标志?[&](常量进程&a、常量进程&b){ 返回func(a)func(b);} ); }; std::函数cmp; 如果(列=“PID”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetPid(); }); } else if(列=“CPU”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetRatioCPU(); }); } else if(列==“命令”){ cmp=cmp发生器([](常数过程和itm){ 返回itm.GetCmd(); }); } 排序(lst.begin(),lst.end(),cmp); },c++,lambda,c++20,higher-order-functions,C++,Lambda,C++20,Higher Order Functions,但是,在编译时,g++报告没有匹配的调用 no match for call to ‘(ProcessList::SortCol(std::string, bool)::<lambda(std::function<T(const Process&)>)>) (ProcessList::SortCol(std::string, bool)::<lambda(const Process&)>)’ 调用(ProcessList::SortCol(s

但是,在编译时,g++报告没有匹配的调用

no match for call to ‘(ProcessList::SortCol(std::string, bool)::<lambda(std::function<T(const Process&)>)>) (ProcessList::SortCol(std::string, bool)::<lambda(const Process&)>)’
调用(ProcessList::SortCol(std::string,bool)::)(ProcessList::SortCol(std::string,bool)::)时,没有匹配项
代码有什么问题?

本例中的主要问题是lambda不是
std::function
。看

CmpGenerator
将其参数推断为
std::function
,但lambda永远不会匹配该参数,因此推断失败

此外,
CmpGenerator
的主体尝试返回两个不同lambda中的一个,这两个lambda具有不同的类型。这些lambda不能相互转换,因此条件表达式将失败。但是我们也无法推断
CmpGenerator
的返回类型,因为两个不同的lambda具有不同的类型


我们可以从完全手工操作开始
std::ranges::sort
采用投影,这在这方面非常有用:

if(列==“PID”){

如果(增加){//,你就不能使用
std::ranges::sort()
,用一个指向成员(-function)的指针进行投影吗?这是非常正确的,但我想知道为什么这里的代码在地球上不起作用:即使它可以正确地推断出t,
CmpGenerator
返回一个lambda,它捕获了对
funct