Вероятно, лучше всего, если вы определите операторы отношения для X
#include <tuple>
struct X {
int x;
int y ;
};
bool operator<(X lhs, X rhs) { return std::tie(lhs.x, lhs.y) < std::tie(rhs.x, rhs.y); }
bool operator>(X lhs, X rhs) { ... }
bool operator<=(X lhs, X rhs) { ... }
bool operator>=(X lhs, X rhs) { ... }
, тогда вы можете сделать
template<class Pred>
X get_value(X x1, X x2) { return std::min(x1, x2, Pred()); }
, и вам, вероятно, следует использовать std::less<>
и std::greater<>
вместо std::less<int>
и std::greater<int>
, поскольку шаблон для void
специализируется на правильной работе.
EDIT: Если вас не интересуют реляционные операторы для X
тогда ответ @cigien, вероятно, в порядке