Модераторы: 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   Вверх
mes
Дата 3.4.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

ну это не признак хорошести.. тем более у меня большое сомнение, что этот первый вопрос отражает действительную проблему, ради которой была создана тема smile

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

print(std::string() << "ab, " << 23 << ", " << 3.14159265 );


 smile 


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


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


pattern`щик
****


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

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



Цитата(mes @  3.4.2011,  19:06 Найти цитируемый пост)
она возвращает новую строку, как результат объединения/слияния двух аргументов..

ну да. но как результат - получаем что нужно.
PM WWW   Вверх
volatile
Дата 3.4.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну в принципе можно оставить оба, они друг другу не мешают  smile 
Но все же первый я возьму себе в копилку.
PM MAIL   Вверх
mes
Дата 3.4.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  3.4.2011,  18:24 Найти цитируемый пост)
ну да. но как результат - получаем что нужно. 

оно разное и пример с print _подверждает_ это.. smile

Цитата(volatile @  3.4.2011,  18:28 Найти цитируемый пост)
Но все же первый я возьму себе в копилку. 

только осторожней  smile 


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


pattern`щик
****


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

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



Цитата(mes @  3.4.2011,  19:44 Найти цитируемый пост)
оно разное

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


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


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

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



Код

str << 1
str && 2


в случае 1 : rvalue записывается в lvalue str
в случае 2:  из двух rvalue получается третья rvalue

ну и соответственно разные применение и требования.. 




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


pattern`щик
****


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

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



реализовал так:
Код

#include <string>
#include <iostream>
#include <boost/format.hpp>

struct log_formater {
   log_formater(const std::string& format, const char* file, size_t line, const char* function)
      :_format(format),
      _file(file),
      _line(line),
      _function(function)
   {}

   ~log_formater() {
      std::cout << _file << "(" << _line << "): " << _function << "| " << _format.str() << std::endl;
   }

   template <typename T>
   log_formater& operator% (const T& value) {
      _format % value;
      return *this;
   }

private:
   boost::format _format;
   const char* _file;
   size_t _line;
   const char* _function;
};

#define LOG_MESSAGE(str) log_formater(str, __FILE__, __LINE__, __PRETTY_FUNCTION__)

void function(std::pair<std::vector<std::string>, int>& arg) {
   LOG_MESSAGE("message arg1-%1%, arg2-%2%") % 34 % 43;
}

int main() {
   LOG_MESSAGE("simple log message");
   std::pair<std::vector<std::string>, int> farg;
   function(farg);
}

http://liveworkspace.org/code/f43be67a2474...750755644358655

всем спасибо.

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


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


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

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



Цитата(boostcoder @  8.4.2011,  20:13 Найти цитируемый пост)
реализовал так:

вот вроде то же самое, но меньше строчек кода :
http://liveworkspace.org/code/e5e3276a6674...1f19c76e6a91b7d
smile


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


pattern`щик
****


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

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



mes, да, это получше будет. и по быстрее. спасибо smile 
PM WWW   Вверх
mes
Дата 8.4.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата("boostcoder")

за оптимизацию кода+++

ну оптимизации то там как таковой и не было, просто выкинил все лишнее, что Вы туда впихнули  smile 



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


pattern`щик
****


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

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



кода меньше + результат тот же = оптимизация. по любому ;)

PM WWW   Вверх
mes
Дата 9.4.2011, 15:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  8.4.2011,  22:19 Найти цитируемый пост)
кода меньше + результат тот же = оптимизация. по любому ;)

как по мне, то устранение_пессимизации   и оптимизация разные хотя и смежные понятия..  smile 
но в любом случае это не тема для спора smile


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


pattern`щик
****


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

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



попробовал скомпилить код с отключенной отладкой, и улыбнулся.
все что после закрывающейся скобки макроса, остается ведь smile 
Код

#ifndef DISABLE_LOGGING
#define LOG_MESSAGE(str) _тут_всякий_код_инлайнящийся_в_код_
#else
#define LOG_MESSAGE(str)
#endif


нужно и аргументы в макрос писать. а для этого нужен variadic_macros. разбираюсь...
PM WWW   Вверх
mes
Дата 9.5.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  8.5.2011,  18:22 Найти цитируемый пост)
 с отключенной отладкой, и улыбнулся.

 smile  smile  smile  smile 

Цитата(boostcoder @  8.5.2011,  18:22 Найти цитируемый пост)
а для этого нужен variadic_macros. разбираюсь... 

а если так : http://liveworkspace.org/code/85de8371fccd...8001c0d182d26ba ?


--------------------
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0824 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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