Сделать WeakComparator
шаблоном класса.
template <typename T>
struct WeakComparator : private std::unary_function<T, bool>
{
explicit WeakComparator(const std::weak_ptr<T>& ptr) : m_comparePtr(ptr) { }
bool operator()(const std::weak_ptr<T>& ptr1) const
{
if (ptr1.expired() || m_comparePtr.expired())
return false;
return ptr1.lock() == m_comparePtr.lock();
}
private:
const std::weak_ptr<T>& m_comparePtr;
};
и затем используйте
const auto pos = std::find_if(cars.begin(), cars.end(), WeakComparator<T>(wPtr));
Если вы можете использовать C ++ 17, вы можете пропустить часть <T>
и использовать
const auto pos = std::find_if(cars.begin(), cars.end(), WeakComparator(wPtr));
В противном случае вы можете использовать вспомогательную функцию для уменьшения избыточности:
template <typename T>
WeakComparator<T> makeWeakComparator(const std::weak_ptr<T>& ptr)
{
return WeakComparator<T>(ptr);
}
и используйте
const auto pos = std::find_if(cars.begin(), cars.end(), makeWeakComparator(wPtr));