#cpp
Как передать в функцию флаг форматирования std::left, std::right или std::internal?
Ответы
Ответ 1
Вообще-то можно передавать их и как целые числа (точнее, перечисление) - просто нужно передавать не std::left, а ios_base::left, и использовать не в конструкции <<, а как параметр setf(). Обычно почему-то этот метод оказывается незаслуженно забыт. Подробнее - см. тут.Ответ 2
Например, таким образом #include#include #include void f( const std::string &s, std::ios_base & flag(std::ios_base & ) ) { std::cout << std::setw( 20 ) << flag << s << std::endl; } int main() { f( "Hello", std::left ); f( "Hello", std::right ); return 0; } Вывод программы на консоль: Hello Hello Аналогичным образом можно использовать std::internal Все эти флаги, то есть функции-манипуляторы потоком, имеют одинаковое объявление std::ios_base & flag(std::ios_base & ): Ответ 3
Если уж задаться целью передавать именно манипуляторы (вместо более гибкого и разумного варианта с флагами, предложенного @Harry), то вместо того, чтобы заниматься филигранным выписыванием конкретного типа этих манипуляторов лучше тем или иным образом полностью от него абстрагироваться static_assert( std::is_same::value && std::is_same ::value, ""); void foo(const std::string &str, decltype(std::left) alignment) { std::cout << std::setw(42) << alignment << str << std::endl; }
Комментариев нет:
Отправить комментарий