Учитывая следующее:
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
вместо этого?
Ограничения:
- Я ничего не могу использовать из библиотеки наддува.
- Наш компилятор недостаточно крут для поддержки лямбда-выражений C ++ 0x.