鉴于以下情况:
struct Foo
{
int bar() const;
};
struct IsEqual : public std::unary_function<Foo*, bool>
{
int val;
IsEqual(int v) : val(v) {}
bool operator()(const Foo* elem) const
{
return elem->bar() == val;
}
};
我有一个容器,Foo*我使用std::find_if并std::not1找出容器中是否有任何元素bar()返回与给定值不同的东西。代码如下所示:
// Are all elements equal to '2'?
bool isAllEqual(const std::vector<Foo*> &vec)
{
return find_if(vec.begin(), vec.end(), std::not1(IsEqual(2))) == vec.end();
}
快进到未来,我现在有一个不同的容器,这次包含std::tr1::shared_ptr<Foo>. 我很想在重载版本的isAllEqual(). 但我不能。 Foo*并且shared_ptr<Foo>是不同的类型。我需要继承,unary_function所以我可以使用not1. 如果我可以避免两次编写相同的函子,那就更优雅了。
问题:
- 有什么方法可以编写
IsEqual它可以同时使用原始指针和智能指针? - 我是否使用 给自己戴上手铐
std::not1?我应该改写IsNotEqual吗?
限制:
- 我不能使用 boost 库中的任何东西。
- 我们的编译器不够酷,无法支持 C++0x lambda。