Работа с парами в методах C++

271
27 июля 2021, 06:10

Есть метод, работающий с очередью пар deque. Нужно, чтобы при определенных входных данных, метод, работал либо с первой частью пары, либо со второй. Пример:

void max3(deque<pair<int, int>> & q, [first or second] ) {
    int a = q[0].[first or second];
    cout << a << endl;
}
Answer 1

Я бы написал так:

void max3(deque<pair<int, int>> &q, bool use_second)
{
    int a = (use_second ? q[0].second : q[0].first);
    cout << a << endl;
}

можно ли это реализовать через прямое указание в аргументах, либо first, либо second, без лишних методов и условий?

Тогда можно использовать указатель-на-член-класса (pointer-to-member):

void max3(deque<pair<int, int>> &q, int pair<int, int>::* member)
{
    int a = q[0].*member;
    cout << a << endl;
}

Пример использования: max3(foo, &pair<int, int>::first).

Answer 2

Конкретно для данных пар целочисленного типа, это просто:

void max3(const std::deque<pair<int, int>>& q, bool x )
{   
    std::cout <<  q[0].first * x + q[0].second * (!x) << std::endl;
}

P.S. Преимущество аргумента булевского типа в том, что есть возможность передать любой предикат. Ну, и конечно, без проверки нельзя тут обойтись, потому что(по хорошему) в функции нужно провести проверку очереди на пустоту

READ ALSO
Следы при использовании ScrollWindow.WinAPI

Следы при использовании ScrollWindow.WinAPI

Пытаюсь создать полосу прокруткиИспользовал ScrollWindow после него вызываю UpdateWindow, но все равно получается что-то не то

186
Что получится и как это работает?(c++)

Что получится и как это работает?(c++)

Подскажите, пожалуйста, что получится в каждом варианте и почему

214
Как повесить click на label с input?

Как повесить click на label с input?

Делаю на Wordpress форму с возможностью добавления нескольких фалов путём создание нескольких заранее определённых инпутов:

215