Для простоты, скажем, я хочу реализовать функцию, которая принимает два параметра и предикат, который проверяет равенство,
template<typename T, typename TCompare>
bool Eq(const T& a, const T& b, const TCompare& cmp) {
return cmp(a, b);
}
но я также хочу, чтобы operator==
предполагалось, если предикат не передан.
Я пробовал несколько разных подходов, но все привели к синтаксической ошибке или "operator ==" не определено. Я даже пытался заменить функцию Eq
на
Тем не менее, я предполагаю, что то, что я хочу, возможно, так как большая часть STL поддерживает не передачу необязательного параметра TCompare (std :: sort, std :: set ...).
UPDATE :
Благодаря предложению levis501, это лучший способ, который я нашел до сих пор:
template<typename T, typename TCompare>
bool Eq(const T& a, const T& b, const TCompare& cmp) {
return cmp(a, b); // or some lengthy code
}
template<typename T>
bool Eq(const T& a, const T& b) {
static std::equal_to<T> EqCmp;
return Eq(a, b, EqCmp);
}
Итак, вам нужно создать оболочку, которая передает std :: equal_to или любой другой эквивалентный оператору функтор. По какой-то причине наличие его в качестве аргумента по умолчанию не компилируется при вызове функции без нее.