1

ファンクターを宣言し、そのファンクターをパラメーターとしてstd::sortを呼び出しました。コード:

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);

簡単な質問:これを1行で実行できますか?

4

1 に答える 1

5

をサポートしている場合は、ラムダを使用できます

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

がない場合は、ファンクターの代わりに関数を使用することで、少しだけ単純化できます。

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"))));

boost --bindの使用を検討している場合は、代わりにこれを試すことができます

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

std::bindこれはと同等です。

于 2013-03-03T01:19:50.870 に答える