[c++]преобразование чисел в строковое представление

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’

vall

перегрузи бинарное отрицание или унарный минус чтоб точно никто ничего не понял

Oper

stringstream ?

Serab

Если надо именно "склеить из разных кусков" и никаких более требований, то ответ написали: ostringstream os; os << "blablabla" << 17; result = os.str;
Но меня это всегда бесило, потому что хочется форматирования в стиле printf но с безопасностью по типам. Там есть несколько решений, но на поток еще ничего не поставил, можно нагуглить.

Maurog

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;

Serab

вот-вот, отличный велосипед! Сами написали?

Maurog

вот-вот, отличный велосипед!
причем я считаю, что вариант с плейсхолдерами - самый правильный и тут ostream, boost идут в пень
у нас раньше был крутой велосипед с возможностью форматировать еще внутри плейсхолдера (как %7f умел текущую локаль подсасывать в рантайме, case можно было сделать (отлично для вывода енумов подходило весь на icu , монструозный слишком. решения с тупыми плейсхолдерами отлично подходит для серверного кода. для гуя старый монстр используется и это правильно
Сами написали?
ага, но только для широких строк, но в стиле TDD.

elenangel

спасибо всем отметившимся, про stringstream я тоже думал, но думал может есть какое-то общепринятое решение с плейсхолдерами,
Когда пользовался QString использовал функцию arg которая понимает холдеры вида %1 %2 и т.д.
stringstream не совсем удобное решение, так как добавляет 2 лишние строки кода.
перегрузка же почему-то не различает unsigned и signed типы, хотя имхо должна.

agent007new


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

erotic

потому что хочется форматирования в стиле printf но с безопасностью по типам
Их есть в gcc. Хотя, конечно, ты все равно не сможешь выводить туда непростые типы.

Werdna

каким образом делать, чтобы легко было использовать?
Самый нормальный способ — snprintf.
Что точно нельзя: стринстримы и особенно буст.

elenangel

а чем плох stringstream?

okunek

Это Пианист, не обращай внимания.

0000

,

TCHAR Buffer[1024];
sprintf (Buffer, "%s - %i", str.c_str 45);

?
P.S. Не заметил, что про него уже сказал.

Maurog

TCHAR Buffer[1024];
sprintf (Buffer, "%s - %i", str.c_str 45);
пример того, как писать не надо :grin:

onyxis

а можете нубу объяснить, чем sprintf плох?

Serab

ну как минимум в конкретном приведенном примере классический buffer overflow, надо snprintf

Serab

Ну это как бе не C++. Тогда уж надо тупо обернуть snprintf в свою обертку, которая возвращает std::string, например, пытаясь выделить буфер подходящего размера.

evgen5555

Тем, что форматированный вывод в стримах был реализован кем-то явно без головы.

erotic

А конкретно что там не так? Я внутрь не лез, но с виду работает :)

Serab

Ну по мне так это непригодно для сколько-нибудь нормальных программ, подразумевающих возможность/необходимость локализации. printf-style гораздо удобнее локализовать, можно эти строки выкинуть в ресурсы/что-нибудь еще собранное в одном месте и т.д.
да и это еще не говоря о том, что надо слишком много левых символов писать, читаемость понижается.

evgen5555

Очень сложно, стримовый аналог простой строки "A=0x%04X, b=%.5f, C=0x%04x, d=%.5f" в голове не у каждого укладывается.
Оставить комментарий
Имя или ник:
Комментарий: