Несколько человек предложили использовать функторы, и это хороший совет.Замечательно, что эквиваленты функторов == и! = И других подобных операторов сравнения уже существуют как часть стандартной библиотеки C ++.Вот как я это сделаю:
#include <functional>
#include <iostream>
template <class T, template <class T> class BinaryFunctor>
void doSomething(T x, T y, BinaryFunctor<T> f) {
if (f(x, y)) {
std::cout << "True" << std::endl;
} else {
std::cout << "False" << std::endl;
}
}
int main(int argc, const char* argv[])
{
doSomething(5, 5, std::equal_to<int>());
return 0;
}
Функция шаблона doSomething
принимает два аргумента одного типа T
и один аргумент типа BinaryFunctor<T>
.Обратите внимание, что T присутствует во всех трех параметрах и поэтому должен быть одинаковым во всех передаваемых аргументах.Таким образом, передача двух int
с и std::equal_to<int>
- это нормально (как я сделал в примере), потому что T
можно создать до int
и BinaryFunctor
до std::equal_to
.
std::equal_to
является примером одного из объектов функции сравнения стандартной библиотеки (или функторов).Это просто класс, который переопределяет operator()
, так что объект типа std::equal_to
может использоваться, как если бы он был реальной функцией.Поэтому, когда объект типа std::equal_to
передается в функцию в качестве аргумента f
, вы можете использовать его как f(someInt, anotherInt)
.
Теперь, если вы хотите изменить вместо этого оператор сравнения на !=
Вам нужно всего лишь изменить вызов функции на doSomething(5, 5, std::not_equal_to<int>());
, и он будет работать как положено.Вы также найдете другие функторы, такие как (опуская пространство имен std
): greater
, less
, greater_equal
, less_equal
и другие.