Допустим, у меня есть функция: pair<int, int> foo()
Я хочу напрямую выводить оба элемента этого без используя временный.
Есть ли способ, которым я могу вывести это, или, возможно, преобразовать его в строку для вывода? Могу ли я использовать tie
сделать это?
Вот что я пытаюсь сделать с временный:
const auto temporary = foo();
cout << temporary.first << ' ' << temporary.second << endl;
Нет. Вы не можете написать эту функцию без использования временного. Если вам действительно нужно, вам, вероятно, следует изменить структуру вашего кода. Технически, вы также можете использовать глобальную переменную (хотя я настоятельно не рекомендую это). Я не думаю tie
будет работать так, как вы хотите.
В стандарте 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;
}
Вы можете создать небольшой класс, который оборачивает 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
… но я не очень рекомендую это, особенно для заголовка, так как вы в основном измените поведение стандартных типов, и ваши коллеги (или вы сами, в будущем) могут быть смущены этим.