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