Я знаю, что оператор запятой, вероятно, самый простой способ сделать это, но для полноты вот кое-что, что я придумал, в основном потому, что я хотел показать свое небольшое обобщение iomanip. Стандартные библиотеки iomanips являются функциями. Перегрузка <<
принимает указатель на функцию. Я продлил это для произвольных вызываемых объектов, которые принимают и возвращают потоки по ссылке.
template <class Stream, class Func>
auto operator << (Stream& s, Func f) ->
std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
{
return f(s);
}
С помощью этого небольшого инструмента в нашем наборе инструментов легко написать выражение сгиба, которое делает абсолютно все, что мы хотим.
template<typename ...Args>
void output_args(Args&&... args)
{
(std::cout << ... << [&](auto& x)->auto&{return x << args << '\n';});
}
Этот метод может использоваться в сценариях, где нам нужно фиксировать значение выражения сгиба, а не его побочные эффекты. Оператор запятой менее полезен в таких контекстах.