вот моя функция
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;
}
кто-нибудь знает лучший способ?
Вы печатаете значение 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;
Обратите внимание, что этот последний способ, вероятно, тоже не так уж велик …;)
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;
};