鉴于以下情况:
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。