Вывод возвращаемой пары без временного - PullRequest
0 голосов
/ 06 декабря 2018

Допустим, у меня есть функция: pair<int, int> foo() Я хочу напрямую вывести оба элемента этого без с использованием временного.

Есть ли способ, которым я могу вывести это,или, может быть, преобразовать его в строку для вывода?Могу ли я использовать tie для этого?

Вот что я пытаюсь сделать с временным:

const auto temporary = foo();

cout << temporary.first << ' ' << temporary.second << endl;

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Вы можете создать небольшой класс, который обернет std::pair, и разрешить выходным потокам печатать его через operator<<:

template<typename PairT>
struct printable {
    const PairT& p;
    printable(const PairT& p)
        :    p{p}
    {}
};

template<typename CharT, typename PairT>
std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& out, const printable<PairT>& pair) {
    out << pair.p.first << ' ' << pair.p.second;
    return out;
}

Затем вы можете использовать его следующим образом:

auto foo() {
    return std::pair<int, int>(1, 2);
}

int main() {
    std::cout << printable(foo());
}

Живой пример


Конечно, вы также можете просто включить печать непосредственно для std::pair ...

template<typename CharT, typename A, typename B>
std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& out, const std::pair<A, B>& pair) {
    out << pair.first << ' ' << pair.second;
    return out;
}

// (...)

std::cout << foo(); // And this would work just fine

.... но я не очень рекомендую это, особенно для заголовка, так как вы в основном измените поведение стандартных типов, и ваши коллеги (или вы сами, в будущем) могут быть смущены этим.

0 голосов
/ 07 декабря 2018

В стандарте c ++ 17 вы можете использовать объявление структурированной привязки

std::pair<int, int> get_pair()
{
    return {10, 20};
}

int main()
{
    auto [x, y] = get_pair();
    std::cout << x << " " << y << std::endl;
    return 0;
}
0 голосов
/ 06 декабря 2018

Нет.Вы не можете написать эту функцию без использования временного.Если вам действительно нужно, вы, вероятно, должны изменить структуру своего кода.Технически, вы также можете использовать глобальную переменную (хотя я настоятельно не рекомендую это).Я не думаю, что tie будет работать так, как вы этого хотите.

...