【发布时间】:2013-10-27 12:53:00
【问题描述】:
上下文:仅限 C++03 + 授权使用 boost
我想提出与中相同的问题
How to negate a predicate function using operator ! in C++?
...但带有一个重载的布尔谓词,即:
struct MyPredicate
{
bool operator()(T1) const;
bool operator()(T2) const;
};
显然,MyPredicate 不能从 std::unary_function 派生,因为不可能定义单个 argument_type。
目的是使用MyPredicate 作为range adaptors 的参数,语法如下:
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;
}
注意运算符 && 和 ||同样可以从这个技巧中受益。
【问题讨论】:
-
可以使用多重继承吗?
struct MyPredicate : unary_function<T1, bool>, unary_function<T2, bool> -
我没有尝试,但鉴于
unary_function派生将定义argument_type,我没有理由认为这不会导致定义冲突。
标签: c++ boost functional-programming