Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузить оператор вывода в строку 
V
    Опции темы
boostcoder
Дата 3.4.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

есть надобность выводить не в поток вывода, а в строку.
обычно вывожу в std::stringstream и методом str() получаю строку.

но мне интересно, а что можно сделать, чтоб не перегружать операторы вывода для каждого типа?
чтоб использовать так:
Код

std::string str;
str << "chars" << 1234 << 3.14159265;

какие варианты есть?

спасибо  smile 

Это сообщение отредактировал(а) boostcoder - 3.4.2011, 12:35
PM WWW   Вверх
mes
Дата 3.4.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



решение в лоб : 
Код

template <typename T>
std::string& operator << (std::string& str, T const& obj)
{
   std::ostringstream os;
   os << str << obj;
   
   str = os.str ();   
   return str;
}

http://liveworkspace.org/code/6ee83fd38547...6351f77f387a06a


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.4.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, спасибо.
я рассматривал такой вариант, но почему-то подумал что оператор вывода в таком случае должен возвращать stringstream&
и недодумал.. поспешил с вопросом.

вопрос закрыт.

Добавлено @ 12:58
mes, еще такой вопрос.
не понимаю, что в следующем коде не так?..
Код

#include <iostream>
#include <sstream>

template <typename T>
std::string& operator << (std::string& str, T const& obj) {
   std::ostringstream os;
   os << str << obj;
   
   str = os.str ();   
   return str;
}

void print(const std::string& str) {
   std::cout << str << std::endl;
}

int main() {
   print(std::string() << "ab, " << 23 << ", " << 3.14159265);
}


http://liveworkspace.org/code/d1e3007290cd...83cfc64321da742

Добавлено @ 13:00
ведь результат выражения "std::string() << "ab, " << 23 << ", " << 3.14159265" - строка

Это сообщение отредактировал(а) boostcoder - 3.4.2011, 13:02
PM WWW   Вверх
mes
Дата 3.4.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  3.4.2011,  11:56 Найти цитируемый пост)
в следующем коде не так?..

грубо : rvalue не может быть присвоена не константной ссылке.. 

http://liveworkspace.org/code/ed9df98b4227...bfa22f845980c07

Добавлено через 46 секунд
Цитата(boostcoder @  3.4.2011,  11:56 Найти цитируемый пост)
вопрос закрыт.

а зря, не очень удачное решение.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.4.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  3.4.2011,  13:02 Найти цитируемый пост)
а зря, не очень удачное решение..

что с этим решением не так? есть варианты получше? ;)
PM WWW   Вверх
mes
Дата 3.4.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  3.4.2011,  12:04 Найти цитируемый пост)
есть варианты получше?

для получше надо подумать.. но должно быть.. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 3.4.2011, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот так имхо по-безопасней, да  и по логичней будет :
http://liveworkspace.org/code/d8dde9cde239...30fa2072feebc34

Код

template <typename T>
std::string operator && (std::string const& str, T const& obj)
{
   std::ostringstream os;
   os << str << obj;
   
   return os.str();
}




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.4.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  3.4.2011,  17:49 Найти цитируемый пост)
operator &&

эм... как-то смущает..
PM WWW   Вверх
mes
Дата 3.4.2011, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  3.4.2011,  16:57 Найти цитируемый пост)
эм... как-то смущает..

a какой оператор лучше отражает концепцию concat ? 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.4.2011, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  3.4.2011,  18:01 Найти цитируемый пост)
a какой оператор лучше отражает концепцию concat ? 

оператор вывода.
PM WWW   Вверх
mes
Дата 3.4.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  3.4.2011,  17:02 Найти цитируемый пост)
оператор вывода. 

<< ?  так посмотрите на действие функции.. она не делает _вывода_ smile



--------------------
PM MAIL WWW   Вверх
mes
Дата 3.4.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Код

template <typename T>
std::string operator && (std::string const& lhs, T const& obj) {

   std::ostringstream os;
   os << rhs;
   
   return lhs + os.str();
}
std::string operator && (std::string const& lhs, std::string const& rhs) {
   return lhs + rhs;
}
 
std::string operator && (std::string const& lhs, const char* rhs) {
   return lhs + rhs;
}


Добавлено @ 18:59
вместо && можно & или ,  если удобнее.. 

Это сообщение отредактировал(а) mes - 3.4.2011, 19:09


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 3.4.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  3.4.2011,  18:04 Найти цитируемый пост)
она не делает _вывода_

она делает вывод в строку smile

PM WWW   Вверх
mes
Дата 3.4.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  3.4.2011,  18:00 Найти цитируемый пост)
она делает вывод в строку

нет, она возвращает новую строку, как результат объединения/слияния двух аргументов..

Добавлено через 43 секунды
первоначальная строка остается неизмененной..

Добавлено через 4 минуты и 57 секунд
именно возвращение ссылки в первоначальном коде и было слабым местом реализации .. 



--------------------
PM MAIL WWW   Вверх
volatile
Дата 3.4.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



mes, мне ваш первый вариант больше понравился
Код

template <typename T>
std::string& operator << (std::string& str, T const& obj)
{
   std::ostringstream os;
   os << obj;
   str += os.str ();   
   return str;
}

по крайней мере он отвечал на первый вопрос:
Цитата(boostcoder @  3.4.2011,  12:35 Найти цитируемый пост)
чтоб использовать так:
std::string str;
str << "chars" << 1234 << 3.14159265;


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.