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

时间:2019-03-18 17:47:58

标签: c++ templates find comparator

我有一个程序试图在向量中找到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;
}

1 个答案:

答案 0 :(得分:0)

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