输出没有临时的返回对

Outputting a Returned pair Without a Temporary

假设我有一个函数:pair<int, int> foo()我想直接输出这个的两个元素而不用使用临时的。

有什么方法可以输出这个,或者把它转换成字符串输出吗?我可以使用 tie 来做到这一点吗?

这是我正在尝试使用 临时文件:

const auto temporary = foo();

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

没有。如果不使用非临时变量,则无法编写该函数。如果你真的需要,你应该改变你的代码结构。从技术上讲,您还可以使用全局变量(尽管我强烈不建议这样做)。我认为 tie 也不会满足您的需求。

您可以创建一个包裹 std::pair 的小 class,并启用输出流以通过 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());
}

Live example


当然,您也可以直接为 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

...但我真的不推荐它,特别是在 header 上,因为你基本上会改变标准类型的行为,而你的同事(或你自己,将来)可能会感到困惑通过它。

在c++17标准中,可以使用structured binding declaration

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

int main()
{
    auto [x, y] = get_pair();
    std::cout << x << " " << y << std::endl;
    return 0;
}