Как реализуются функции iomanip?

Некоторые из стандартных iomanip функции принимают параметр.

Я хотел бы знать, как это достигается, например, могу ли я сделать что-то подобное с функцией? Это действительно решение, которое мне нужно для этот ответ, но я не мог понять, как это сделать.

Когда я посмотрел определение для setw функция, например, в http://en.cppreference.com он перечисляет тип возвращаемого значения как «неопределенный», а также перечисляет только один аргумент, а не принимает stream& параметр. Как это работает?

Этот вопрос имеет отличный ответ но для человека, ищущего этот вопрос; этот ответ будет полезен только в сочетании со следующими функциями, предоставляемыми ios_base:

7

Решение

Вот простой пример пользовательского манипулятора, который принимает один параметр, определенный с помощью класса:

#include <iostream>

class putX // injects some `X`s into the stream
{
std::size_t _n;
public:
explicit putX(std::size_t n): _n(n) {}
std::size_t getn() const {return _n;}
friend std::ostream& operator<<(std::ostream& os, const putX& obj)
{
std::size_t n = obj.getn();
for (std::size_t i = 0; i < n; ++i)
os << 'X';
return os;
}
};

int main()
{
std::cout << putX(10) << " test " << putX(10);
}

Манипуляторы, которые не принимают параметров, могут быть просто реализованы как

std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;}

Это потому что basic_ostream::operator<< имеет перегрузку, которая принимает указатель на функцию std::ostream& (*fp)(std::ostream&) как его правая сторона (например, манипулятор)

PS: Стандартная библиотека C ++ Н. Josuttis описывает, как манипуляторы / пользовательские манипуляторы работают очень подробно, см. гл. 15.6.3 Определяемые пользователем манипуляторы

6

Другие решения


По вопросам рекламы [email protected]