Как упоминает Нил, operator==
вполне может быть бесплатной функцией.
Другой вариант: стандартная библиотека позволяет использовать пользовательские объекты предикатов.В этом случае:
#include <set>
template <typename T>
struct Odp
{
T m_t;
};
struct CompareOdp
{
template <class T>
bool operator() (const Odp<T>& a, const Odp<T>& b) const
{
return a.m_t < b.m_t;
}
};
int main()
{
std::set<Odp<int>, CompareOdp > my_set;
Odp<int> value = {10};
my_set.find(value);
}
(Не уверен, что может быть лучше сделать весь предикат шаблоном. Создание только operator()
шаблона облегчает его использование, так как оно оставляетбольше вещей, которые нужно выяснить компилятору. Не уверен, что в некоторых сценариях может произойти обратный выстрел.)
Также обратите внимание, что std :: set использует предикат для упорядочения (по умолчанию std::less<X>
), не для тестов на равенство.