模板化比较器作为 find_if 中的第三个参数

Templated comparator as a third argument in find_if

我有一个程序试图在向量中找到 weak_ptr。它工作得很好。但也许有一种方法可以将模板化比较器作为第三个参数传递给 find_if?类似于 TWeakComparator 的东西。它将大大减少代码。提前致谢。这是我的代码:

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Car
{
};

template<class T>
struct TWeakComparator: private std::unary_function<Car, bool>
{
    explicit TWeakComparator(const T& ptr) : m_comparePtr(ptr) { }
    bool operator()(const T& ptr1) const
    {
        if (ptr1.expired() || m_comparePtr.expired())
            return false;

        return ptr1.lock() == m_comparePtr.lock();
    }
private:
    const T& m_comparePtr;
};

struct WeakComparator: private std::unary_function<Car, bool>
{
    explicit WeakComparator(const std::weak_ptr<Car>& ptr) : m_comparePtr(ptr) { }
    bool operator()(const std::weak_ptr<Car>& ptr1) const
    {
        if (ptr1.expired() || m_comparePtr.expired())
            return false;

        return ptr1.lock() == m_comparePtr.lock();
    }
private:
    const std::weak_ptr<Car>& m_comparePtr;
};

int main()
{
    std::vector<std::weak_ptr<Car>> cars;

    std::shared_ptr<Car> lambo = std::make_shared<Car>();
    std::weak_ptr<Car> wPtr(lambo);
    cars.emplace_back(lambo);

    const auto pos = std::find_if(cars.begin(), cars.end(), WeakComparator(wPtr));

    if (pos == cars.end())
        std::cout << "Not found!" << std::endl;
    else
        std::cout << "Found!" << std::endl;

    return 0;
}

制作 WeakComparator 一个 class 模板。

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));