Вы можете создать небольшой класс, который обернет 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
.... но я не очень рекомендую это, особенно для заголовка, так как вы в основном измените поведение стандартных типов, и ваши коллеги (или вы сами, в будущем) могут быть смущены этим.