std::string вопросы
От: Holms США  
Дата: 23.09.03 08:38
Оценка:
Наткнулся на неприятную бешь при использовании субжа

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;
}


ну и конечно получил не то что хотел.
Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.
Или есть веская причина для этого? Какая?

Как реализовать более красиво желаемого результат?
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re: std::string вопросы
От: Anton V. Kolotaev  
Дата: 23.09.03 08:42
Оценка:
Здравствуйте, 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>Как реализовать более красиво желаемого результат?


см. (*)
Re: std::string вопросы
От: Павел Кузнецов  
Дата: 23.09.03 08:47
Оценка:
Здравствуйте, Holms, Вы писали:

H> Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.


Подумали. И решили не встраивать это в класс строки, т.к. подобные операции зависят от locale etc.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: std::string вопросы
От: Holms США  
Дата: 23.09.03 08:55
Оценка:
Здравствуйте, Anton V. Kolotaev, Вы писали:


AVK>Потому что уже есть std::stringstream


H>>Как реализовать более красиво желаемого результат?


AVK>см. (*)


Что плохого может получится из-за использовании такой функции

template<class T> std::string& operator += (std::string& s,T value){ 
    std::string res;
    std::ostringstream out(res);
    out << value;
    s += out.str();
    return s;
}


Как написать ее более правильно?
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re: std::string вопросы
От: dupamid Россия  
Дата: 23.09.03 08:55
Оценка:
Здравствуйте, Holms, Вы писали:

H>Наткнулся на неприятную бешь при использовании субжа


H>ну и конечно получил не то что хотел.

H>Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.
H>Или есть веская причина для этого? Какая?

Есть множество способов как преобразовать число в строку, с каким основанием, сколько значащих цифр, выводить ли префикс 0x (или может быть 0X) и т.д. Так что, если есть желание такого преобразования, то пусть пользователь это сделает сам, именно так как хочет. Например, с помощью stringstream или sprintf, по-моему это решение правильное. Хотя не исключено, что по просьбам пользователей оно будет пересмотренно в следующих ревизиях Стандарта.
Re: std::string вопросы
От: _wqwa США  
Дата: 23.09.03 15:36
Оценка:
Здравствуйте, Holms, Вы писали:

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;
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 -- файлик...
Кто здесь?!
Re[2]: std::string вопросы
От: Holms США  
Дата: 24.09.03 07:07
Оценка:
Здравствуйте, _wqwa, Вы писали:


H>>Как реализовать более красиво желаемого результат?

_>Я в этом случае, не парясь мозгом, перегрузил оператор << с первым параметром std::string и вторым -- всеми типами, которые мне были надо. Могу тебе забросить этот *.h -- файлик...


Спасибо, но я тоже так сделал
... << RSDN@Home 1.1 beta 2 >>
The life is relative and reversible.
Re[2]: std::string вопросы
От: alexkro  
Дата: 24.09.03 08:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, Holms, Вы писали:


H>> Неужели разработчики не подумали о таких вешах как конкатенация строки с простыми типами данних.


ПК>Подумали. И решили не встраивать это в класс строки, т.к. подобные операции зависят от locale etc.


Расширим вопрос: какой способ преобразования простых типов в строку является предпочтительным и по каким критериям?

1) std::stringstream
2) sprintf
3) boost::lexical_cast
4) boost::format
5) ?
Re[3]: std::string вопросы
От: Павел Кузнецов  
Дата: 24.09.03 08:56
Оценка:
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: std::string вопросы
От: alexkro  
Дата: 25.09.03 07:56
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, alexkro, Вы писали:


a>> 5) ?


ПК>Неужели 1-4 мало?


Я так и думал, что в stlsoft тоже свой метод есть: http://www.cuj.com/documents/s=8006/cuj0212wilson/wilson.htm
Re[4]: std::string вопросы
От: alexkro  
Дата: 25.09.03 08:04
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, alexkro, Вы писали:


a>> 4) boost::format


ПК>Использует (1). Косметическое улучшение на любителя.


Как-то у меня была задача: форматировать локализуемые сообщения. Причем локализация предполагала возможное изменение порядка параметров, выводимых вместе с сообщением. boost::format — идеальное решение этой проблеммы, так как он допускает нумерацию параметров в форматной строке, что недоступно в sprintf.
Re[5]: std::string вопросы
От: Павел Кузнецов  
Дата: 25.09.03 08:12
Оценка:
Здравствуйте, alexkro, Вы писали:

a> Я так и думал, что в stlsoft тоже свой метод есть:

a> http://www.cuj.com/documents/s=8006/cuj0212wilson/wilson.htm

Типичный пример повышения производительости путем урезания функциональности. В частности, по сравнению
с std::ostream не учитываются настройки форматирования и std::locale. При этом большой вопрос, действительно
ли преобразование целых в строки являлось узким местом в программе. С другой стороны, если нужно именно
подобное упрощенное преобразование, то почему бы и нет?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: std::string вопросы
От: Павел Кузнецов  
Дата: 25.09.03 08:31
Оценка:
Здравствуйте, alexkro, Вы писали:

a> локализация предполагала возможное изменение порядка параметров, выводимых вместе

a> с сообщением. boost::format — идеальное решение этой проблеммы

Всецело согласен. Как-то забыл о подобных проблемах, когда отвечал.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.