コンテキスト: C++03 のみ + ブーストの使用が許可されています
と同じ問題を提起したい
...しかし、オーバーロードされたブール述語を使用すると、次のようになります。
struct MyPredicate
{
bool operator()(T1) const;
bool operator()(T2) const;
};
単一の を定義することは不可能であるため、明らかに、MyPredicate
から派生できません。std::unary_function
argument_type
目的は、次のような読み取り可能な構文で、range adaptersMyPredicate
の引数として使用することです。
using boost::for_each;
using boost::adaptors::filtered;
list<T1> list1;
list<T2> list2;
for_each(list1 | filtered(!MyPredicate()), doThis);
for_each(list2 | filtered(!MyPredicate()), doThat);
もちろん、明示的な曖昧さ回避を含む解決策は、ここでは重要ではありません。
前もって感謝します。
[承認された解決策]
私はAngewのソリューションのわずかに変更されたバージョンを使用しています:
template <class Predicate>
struct Not
{
Predicate pred;
Not(Predicate pred) : pred(pred) {}
template <class tArg>
bool operator() (const tArg &arg) const
{ return !pred(arg); }
};
template <class Pred>
inline Not<Pred> operator! (const Pred &pred)
{
return Not<Pred>(pred);
}
template <class Pred>
Pred operator! (const Not<Pred> &pred)
{
return pred.pred;
}
演算子 && および || に注意してください。同様に、このトリックの恩恵を受けることができます。