Наткнулся на неприятную бешь при использовании субжа
int main(int argc, char **argv)
{
int i = 66;
double d = 3.45;
long l = 234;
char c = 't';
string s;
s = "test -> ";
string ss;
ss = s; ss += i; cout << ss << endl;
ss = s; ss += d; cout << ss << endl;
return 0;
}
ну и конечно получил не то что хотел.
Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.
Или есть веская причина для этого? Какая?
Как реализовать более красиво желаемого результат?
Здравствуйте, Holms, Вы писали:
H>Наткнулся на неприятную бешь при использовании субжа
H>
H>int main(int argc, char **argv)
H>{
H> int i = 66;
H> double d = 3.45;
H> long l = 234;
H> char c = 't';
H> string s;
H> s = "test -> ";
H> string ss;
ostringstream out(ss); // (*)
H> out << i; cout << out.str() << endl;
H> out << d; cout << out.str() << endl;
H> return 0;
H>}
H>
H>ну и конечно получил не то что хотел. H>Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних. H>Или есть веская причина для этого? Какая?
Потому что уже есть std::stringstream
H>Как реализовать более красиво желаемого результат?
Здравствуйте, Holms, Вы писали:
H>Наткнулся на неприятную бешь при использовании субжа
H>ну и конечно получил не то что хотел. H>Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних. H>Или есть веская причина для этого? Какая?
Есть множество способов как преобразовать число в строку, с каким основанием, сколько значащих цифр, выводить ли префикс 0x (или может быть 0X) и т.д. Так что, если есть желание такого преобразования, то пусть пользователь это сделает сам, именно так как хочет. Например, с помощью stringstream или sprintf, по-моему это решение правильное. Хотя не исключено, что по просьбам пользователей оно будет пересмотренно в следующих ревизиях Стандарта.
H>int main(int argc, char **argv)
H>{
H> int i = 66;
H> double d = 3.45;
H> long l = 234;
H> char c = 't';
H> string s;
H> s = "test -> ";
H> string ss;
H> ss = s; ss += i; cout << ss << endl;
H> ss = s; ss += d; cout << ss << endl;
H> return 0;
H>}
H>
H>ну и конечно получил не то что хотел. H>Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних. H>Или есть веская причина для этого? Какая?
H>Как реализовать более красиво желаемого результат?
Я в этом случае, не парясь мозгом, перегрузил оператор << с первым параметром std::string и вторым -- всеми типами, которые мне были надо. Могу тебе забросить этот *.h -- файлик...
H>>Как реализовать более красиво желаемого результат? _>Я в этом случае, не парясь мозгом, перегрузил оператор << с первым параметром std::string и вторым -- всеми типами, которые мне были надо. Могу тебе забросить этот *.h -- файлик...
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Holms, Вы писали:
H>> Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.
ПК>Подумали. И решили не встраивать это в класс строки, т.к. подобные операции зависят от locale etc.
Расширим вопрос: какой способ преобразования простых типов в строку является предпочтительным и по каким критериям?
Здравствуйте, alexkro, Вы писали:
a> Расширим вопрос: какой способ преобразования простых типов в строку a> является предпочтительным и по каким критериям?
a> 1) std::stringstream
Хороший стандартный способ для повседневных нужд.
a> 2) sprintf
Только в случае, если (1) почему-либо использовать не получается.
a> 3) boost::lexical_cast
Использует (1). Неплохое косметическое улучшение для простых нужд.
a> 4) boost::format
Использует (1). Косметическое улучшение на любителя.
a> 5) ?
Неужели 1-4 мало?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, alexkro, Вы писали:
a>> 4) boost::format
ПК>Использует (1). Косметическое улучшение на любителя.
Как-то у меня была задача: форматировать локализуемые сообщения. Причем локализация предполагала возможное изменение порядка параметров, выводимых вместе с сообщением. boost::format — идеальное решение этой проблеммы, так как он допускает нумерацию параметров в форматной строке, что недоступно в sprintf.
Типичный пример повышения производительости путем урезания функциональности. В частности, по сравнению
с std::ostream не учитываются настройки форматирования и std::locale. При этом большой вопрос, действительно
ли преобразование целых в строки являлось узким местом в программе. С другой стороны, если нужно именно
подобное упрощенное преобразование, то почему бы и нет?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, alexkro, Вы писали:
a> локализация предполагала возможное изменение порядка параметров, выводимых вместе a> с сообщением. boost::format — идеальное решение этой проблеммы
Всецело согласен. Как-то забыл о подобных проблемах, когда отвечал.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен