[c++]преобразование чисел в строковое представление
перегрузи бинарное отрицание или унарный минус чтоб точно никто ничего не понял
stringstream ?
Но меня это всегда бесило, потому что хочется форматирования в стиле printf но с безопасностью по типам. Там есть несколько решений, но на поток еще ничего не поставил, можно нагуглить.
stringstream ?приведу пример: http://codepad.org/JLOQmmSh
мы на работе используем велосипед типа такого:
const int x = 987;
const int y = 9012;
std::cout << FormatString( "number: {0} is not so big as {1}", x, y) << std::endl;
вот-вот, отличный велосипед! Сами написали?
вот-вот, отличный велосипед!причем я считаю, что вариант с плейсхолдерами - самый правильный и тут ostream, boost идут в пень
у нас раньше был крутой велосипед с возможностью форматировать еще внутри плейсхолдера (как %7f умел текущую локаль подсасывать в рантайме, case можно было сделать (отлично для вывода енумов подходило весь на icu , монструозный слишком. решения с тупыми плейсхолдерами отлично подходит для серверного кода. для гуя старый монстр используется и это правильно
Сами написали?ага, но только для широких строк, но в стиле TDD.
Когда пользовался QString использовал функцию arg которая понимает холдеры вида %1 %2 и т.д.
stringstream не совсем удобное решение, так как добавляет 2 лишние строки кода.
перегрузка же почему-то не различает unsigned и signed типы, хотя имхо должна.
cout << boost::format("writing %1%, x=%2% : %3%-th try") % "toto" % 40.23 % 50; // prints "writing toto, x=40.230 : 50-th try"
cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35; // Posix-Printf style
потому что хочется форматирования в стиле printf но с безопасностью по типамИх есть в gcc. Хотя, конечно, ты все равно не сможешь выводить туда непростые типы.
каким образом делать, чтобы легко было использовать?Самый нормальный способ — snprintf.
Что точно нельзя: стринстримы и особенно буст.
а чем плох stringstream?
Это Пианист, не обращай внимания.
TCHAR Buffer[1024];
sprintf (Buffer, "%s - %i", str.c_str 45);
?
P.S. Не заметил, что про него уже сказал.
TCHAR Buffer[1024];пример того, как писать не надо
sprintf (Buffer, "%s - %i", str.c_str 45);
а можете нубу объяснить, чем sprintf плох?
ну как минимум в конкретном приведенном примере классический buffer overflow, надо snprintf
Ну это как бе не C++. Тогда уж надо тупо обернуть snprintf в свою обертку, которая возвращает std::string, например, пытаясь выделить буфер подходящего размера.
Тем, что форматированный вывод в стримах был реализован кем-то явно без головы.
А конкретно что там не так? Я внутрь не лез, но с виду работает
да и это еще не говоря о том, что надо слишком много левых символов писать, читаемость понижается.
Очень сложно, стримовый аналог простой строки "A=0x%04X, b=%.5f, C=0x%04x, d=%.5f" в голове не у каждого укладывается.
Оставить комментарий
elenangel
каким образом делать, чтобы легко было использовать?конкретнее, я хочу в некоторых местах программы склеивать строки из разных кусков: const char*, char *, string, int32_t, uint32_t, int64_t, uint64_t
и результат складывать в string
потом результат нужно отправить в поток или отдать какой-то функции которая понимает string.
пробовал перегрузить string operator+(const string, const int32_t) и string operator+(const string, const uint32_t) но при линковке получаю что main.cpp:231: error: ambiguous overload for ‘operator+’ in ‘result + res’