setw внутри функции для возврата ostream

вот моя функция

ostream margain(std::string firstWord)
{
ostream x;
x << std::setw(20) << firstWord;
return x;
}

в основном я хочу использовать функцию следующим образом

std::cout<< margain("start") << "````````````````````````````````````" << std::endl;
// print things out
//then
std::cout<< margain("End") << "````````````````````````````````````" << std::endl;

Я получаю вывод, начало или конец не отображается, а возвращаемое значение

0««««««««««««««««««

как я могу это исправить? и почему?

Редактировать:
Я знаю, что это то, что вызывает функцию, потому что, если я добавлю это

соиЬ << станд :: setw (20) << первое слово;
в функции, он печатает правильно,

Я исправил это не лучшим образом, но как

вызывая функцию как

маржа (std :: cout, «End») <<
«~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ = ~ » << епсИ;

функция выглядит так

ostream& margain(ostream& stream, std::string firstWord)
{
stream << std::left << std::setw(10) << firstWord;
return stream;
}

кто-нибудь знает лучший способ?

0

Решение

Вы печатаете значение ostream, а не значение firstword, ostream x в данном случае это неоткрытый поток, поэтому он ничего не «делает». Потому что компилятор позволяет преобразовать в bool (C ++ 11) или void * (до C ++ 11) печатается «значение» из этого преобразования. Обратите внимание, что любые операции на x не повлияет cout,

Я думаю, что самое простое решение — добавить std::setw(20) к вашей выходной строке:

std::cout<< std::setw(20 << "End" << "````````````````````````````````````" << std::endl;

Другим выбором будет передать std::cout в margainи вернуть std::string, что-то вроде этого:

std::string margain(ostream& x, const std::string& firstWord)
{
x << std::setw(20);
return firstWord;
}

тогда вы могли бы сделать:

std::cout<< margain(cout, "start") << "````````````````````````````````````" << std::endl;

Но это не совсем гибкий или «аккуратный».

Третий вариант, конечно, иметь MarginString учебный класс:

class MarignString
{
private:
int margin;
std::string str;
public:
MarginString(int margin, std::string str) margin(margin), str(str) {}
operator std::string() { return str; }
friend std::ostream& operator(std::ostream& os, const MarginString& ms);
};std::ostream& operator(std::ostream& os, const MarginString& ms)
{
os << std::setw(ms.margin) << ms.str;
return os;
}

...
std::cout<< MarginString(20, "start") << "````````````````````````````````````" << std::endl;

Обратите внимание, что этот последний способ, вероятно, тоже не так уж велик …;)

2

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

struct margin
{
margin(std::string word) : word(word) { }

friend std::ostream& operator <<(std::ostream& os, margin const& m)
{
return os << std::setw(20) << m.word;
}

private:
std::string word;
};
1

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