上下文:仅限 C++03 + 授权使用 boost
我想提出与
...但有一个重载的布尔谓词,即:
struct MyPredicate
{
bool operator()(T1) const;
bool operator()(T2) const;
};
显然,MyPredicate
不能从中派生,std::unary_function
因为不可能定义单个argument_type
.
目的是用作范围适配器MyPredicate
的参数,具有如下可读语法:
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;
}
请注意,运算符 && 和 || 同样可以从这个技巧中受益。