输出没有临时的返回对
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());
}
当然,您也可以直接为 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;
}
假设我有一个函数: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());
}
当然,您也可以直接为 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;
}