2016-11-22 1 views
0

私は以下のようなユーザタイプのstd :: vectorをカプセル化するより複雑なラッパークラスのバージョンを持っています。私はFilter.Filter.Mapなどのようないくつかの連鎖のものをやっているmem_fnによって作成された関数ポインタの結果を否定する方法

struct UserType1Encapsulator 
{ 
    template <typename F> 
    UserType1Encapsulator& Filter(F filterFunction) 
    { 
     std::vector<userType1> newList; 
     for (size_t i = 0; i < iTerrainList.size(); i++) --> can't use range for loop vs2010 
     { 
      if (filterFunction(iTerrainList[i])) 
       newList.push_back(iTerrainList[i]); 

     } 
     encapsulatedList = newList; 
     return *this; 
    } 

std::vector<userType1> encapsulatedList; 
} 

..私は見つけるまで、私は私が

のように渡しています関数ポインタの操作を否定する必要が良かった

すべて

userVec.Filter(std::mem_fn(&userType1::isCopy)); 
私は

userVec.Filter(std::not1(std::mem_fn(&userType1::isCopy))); 

のようなものを使用する必要があります。しかし、私はそれを使用するかどうかはわからない

d残念ながら私はlamdbasにアクセスすることはできません.GCC 4.8でコンパイルしていてもvs2010でコンパイルする必要があるからです。

std :: mem_fnの結果を無効にし、vs2010でコンパイルする正しい方法は何ですか?

答えて

1

ラムダを持っていないときは、それらが呼び出し可能なオブジェクトの文法的な砂糖だけであることに注意してください。独自のジェネリック否定呼び出し可能なを作成します。次のように

template <typename TFunction> 
struct negator 
{ 
    // `_f` will be your mem_fn 
    TFunction _f; 

    negator(TFunction f) : _f(f) { } 

    bool operator()(/* same arguments as isCopy */) const 
    { 
     return !f(/* same arguments as isCopy */); 
    } 
}; 

template <typename TFunction> 
negator<TFunction> make_negator(TFunction f) 
{ 
    return negator<TFunction>(f); 
} 

は、あなたがそれを使用することができるはずです。

userVec.Filter(make_negator(std::mem_fn(&userType1::isCopy))); 

full wandbox example

+0

おかげで良い残りを。私の場合は、熟読者がこのような長いオブジェクトを気に入らない機能パターンに精通していないので、この構文的な砂糖が必要な場合があります。 –

+0

いいえ構文解析的な砂糖はありません。より良い査読者を見つける:P –

+0

私は今このソリューションをstd :: not1、std :: unary_negationなどのような軽いものを期待して使用しました... –

関連する問題