的std ::排序函子一行(std::sort functor one line)

2019-10-17 18:41发布

我宣布一个仿函数,并提出了调用,这样的std ::排序与仿函数作为参数。 码:

struct
{
    bool operator() (const CString& item1, const CString& item2){
        return MyClass::Compare( Order(_T("DESC")), item1, item2);
    }

}Comparer;

std::sort(AllObjects.GetData(), AllObjects.GetData() + AllObjects.GetSize(), Comparer);

简单的问题:我可以用一个线做到这一点?

Answer 1:

如果你的编译器支持C ++ 11 ,你可以使用lambda

std::sort(AllObjects.GetData(), AllObjects.GetData() + AllObjects.GetSize(),
          [](const CString& item1, const CString& item2) {
              return MyClass::Compare( Order(_T("DESC")), item1, item2);
          });

没有C ++ 11 ,你可以用一个函数,而不是一个仿函数的只有一点点把它简化

static inline bool Comparer(const CString& item1, const CString& item2) {
    return MyClass::Compare(Order(_T("DESC")), item1, item2);
}

并使用它作为最后一个参数。

不幸的是(?),也有只为一元或二元函数对象的功能包装。 如果有包装的三元函数对象太多,你可以做类似的东西

std::sort(AllObjects.GetData(), AllObjects.GetData() + AllObjects.GetSize(),
          std::bind1st(std::ptr_fun(MyClass::Compare), Order(_T("DESC"))));

如果你考虑使用升压-绑定 ,可以改为试试这个

std::sort(AllObjects.GetData(), AllObjects.GetData() + AllObjects.GetSize(),
          boost::bind(MyClass::Compare, Order(_T("DESC")), _1, _2));

这等同于std::bind在C ++ 11 。



文章来源: std::sort functor one line