закатывающая в buf какой то текст, длина текста заранее известна. Как бы мне этот текст загнать в std::string не создавая промежуточного буфера? Не то, что это принципиально - но просто оскорбляется моего чувство прекрасного;-) Есть метод
const char* std::string::data()
но вроде как и сигнатура, и документация намекают что он не про то, а больше ничего и не нашел похожего... ;-(
Хотя
string ( const char * s );
Content is initialized to a copy of the string formed by the null-terminated character sequence (C string) pointed by s. The length of the character sequence is determined by the first occurrence of a null character (as determined by traits.length(s)). This version can be used to initialize a string object using a string literal constant.
The returned array points to an internal location which should not be modified directly in the program. Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object.
Сложный выбор.... не люблю я std. Но руками рулить памятью для строк в 3-ем тысячелетии ИМНО содомия, а писать свои строки - я уже вышел из того возраста;-)
Это я прочел. А я если я гарантированно не собираюсь никаких «call to a non-constant member function of the string object» от data() до конца load?
Насколько я понимаю, второе предлоежение - не объяснение первого. Просто запрещается модифицировать внутренние данные, но в реальности, если не забыть сделать правильный resize, скорее всего все будет нормально.
Сложный выбор.... не люблю я std. Но руками рулить памятью для строк в 3-ем тысячелетии ИМНО содомия, а писать свои строки - я уже вышел из того возраста;-)
Можно сделать std::string load() или void load(std::string &). Если этот API забит как void load(char*), я бы предпочел в зависимости от ситуации немного поработать в вызывающем коде с char*-строкой или прочитал в промежуточный буфер и завернул в строку. Не люблю «хакерский» код :)
Гы, а оказывается таки data и c_str возвращают один и тот же пойнтер! И что мешало сделать?
char* std::string::data()
видимо религия....
load на самом деле fread (или gzread), так что тут глухо. Целевая строка - поле класса, и оно превратилось в std::string из char* когда меня задолбало следить за мусором;-)
Ну значицца хакнем с resize-data, не люблю лишних new...
Аааа! Они боялись, что в 2012 лисп таки победит, и все строки будут храниться в виде посимвольных списков. Но data то они все равно ж зачем то оставили, какая уж тут абстракция...