Вывод возвращаемой пары без временного

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

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

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

const auto temporary = foo();

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

2

Решение

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

2

Другие решения

В стандарте 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;
}
2

Вы можете создать небольшой класс, который оборачивает 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

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

2
По вопросам рекламы [email protected]