Как я могу вернуть объект, используя std :: min с std :: less - PullRequest
0 голосов
/ 09 июля 2020

У меня есть следующий код, в котором мне нужно вернуть объект, имеющий c наименьший элемент. Мне нужно использовать std :: больше и std :: less. Код работает, но я не хочу этого. Я хочу, чтобы x3 имел как x, так и y структур с наименьшим x.

#include <iostream>

using namespace std;

struct X {
    
int x;
int y ;
};

class A {
    public:
    A(){}
    template<typename T>
    static X getValue(const X&x1,const X&x2) {
        X x3;
        x3.x =  std::min(x1.x, x2.x,T());
        return x3;
       // x3 = std::min(x1.x, x2.x,T()); Wont work for sure.
    }

};

int main()
{
    X x1;
    x1.x = 10;
    X x2;
    x2.x = 20;
    
    cout<<A::getValue<std::less<int>>(x1,x2).x << std::endl;
    cout<<A::getValue<std::less<int>>(x1,x2).y << std::endl;

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Вероятно, лучше всего, если вы определите операторы отношения для 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, вероятно, в порядке

2 голосов
/ 09 июля 2020

Вы можете написать функцию следующим образом:

template<typename T>
static X getValue(const X&x1,const X&x2) {
    return T{}(x1.x, x2.x) ? x1 : x2;
}

Вот демонстрация .

В качестве альтернативы вы можете передать объект сравнения в качестве аргумента:

template<typename T>
static X getValue(const X&x1,const X&x2, T comp) {
   return comp(x1.x, x2.x) ? x1 : x2;
}

и назовите его так:

cout << A::getValue(x1, x2, std::less{}).x << std::endl;

Вот демо .

...