Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > GUID from std::string


Автор: Master01 1.9.2010, 22:25

Ребята, кто-нибудь может подсказать есть ли вменяемый способ преобразовать строку в GUID, к примеру есть строка

"{70DC58DE-8640-4288-85A3-DE353149376D}"

нужно преобразовать всё это дело в GUID.


Я понимаю что способы есть, но вот только они все какие-то слишком закавырестые для такой, казалось бы, распространённой операции....

Например, есть функция апи CLSIDFromString(LPOLESTR, &guid) 

на входе строка std::wstring wstr;

куда проще! делаю

CLSIDFromString(wstr.c_str(), guid) 

а не тут то было - с_str возвращает const wchar_t*, а мне нужен неконстантный массив!

можно, конечно, объявить массив wchar_t, динамически выделить память под него а потом всё скопировать туда (std::copy) и передать всё это хозяйство в CLSIDFromString, НО ёлки-палки, почему так сложно! потом ещё надо не забыть по окончанию осовободить память, забранную под буффер!


Ещё пробовал через boost::lexical_cast. Конечно, там такой конвертации нет, т.к. нету operator >> () для GUID, пришлось писать, написал, но опять же почему так сложно то?


Просто вроде операция не экзотическая совсем, а на поверку оказывается что нормально инструмента нету ... ну или я не нашёл ... может вы подскажете?

заранее спасибо


ПС .NET не предлагать

Автор: jonie 1.9.2010, 22:30
UuidFromString функция есть.
Цитата


можно, конечно, объявить массив wchar_t, динамически выделить память под него а потом всё скопировать туда (std::copy) и передать всё это хозяйство в CLSIDFromString, НО ёлки-палки, почему так сложно! потом ещё надо не забыть по окончанию осовободить память, забранную под буффер!

а можно присвоить std::wstring-у ваш std::string .... для обычных типов прокатит, либо использовать UuidFromStringA функцию (что особо не рекомендуют)

Автор: alexvs11 1.9.2010, 22:50
кхм

Код

CLSIDFromString( (char*)wstr.c_str(), guid) ;

должно работать

Автор: ИванМ 1.9.2010, 23:24
Рекомендую простой способ:
Код

CLSIDFromString(const_cast<wchar_t*>(wstr.c_str()), guid) 

Автор: Master01 2.9.2010, 15:14

ха-ха smile откровенно говоря, я просто постяснялся приводить константный тип к неконстантному, наивно полагая, что раз функция ожидает неконстантный массив, то значит это неспроста и она что-то там меняет, а раз так то это может нарушить целостность контейнера ...

я всё ж в итоге сделал так 

Код

auto_ptr<wchar_t> wc_str (new wchar_t[wstring.size()]);

copy(wstring.begin(), wstring.end(), wc_str);

CLSIDFromString(wc_str, guid);


конечно, немного напрягает, но так я уверен что работать будет всегда. Такого шаманства с константностью лучше избегать всё ж... хотя в данном случае, наверно, можно...


всем спасибо


Автор: ИванМ 2.9.2010, 15:24
Master01, 
Цитата(Master01 @  2.9.2010,  15:14 Найти цитируемый пост)
Такого шаманства с константностью лучше избегать всё ж... 

На самом деле да. Но если точно знаешь, что параметр не сделан константным только по доброй воли программиста (а такое бывает даже в крутых библиотеках за $млн), то const_cast можно использовать.

Цитата(Master01 @  2.9.2010,  15:14 Найти цитируемый пост)
хотя в данном случае, наверно, можно...

Я посмотрел в MSDN эту функцию - первый параметр - IN. Поэтому и предложил. Хотя, возможно, я неправ.

Автор: Master01 2.9.2010, 15:28

да, согласен, конечно, что сonst могли просто и упустить...

кстати, я вверху прогнал насчёт auto_ptr и массивов, но не суть важно

Автор: ИванМ 2.9.2010, 15:56
А вот к auto_ptr у меня личная неприязнь. Я вообще придерживаюсь мнения, что в стандарте c++ он лишний.

Автор: mes 2.9.2010, 16:23
Цитата(ИванМ @  2.9.2010,  14:56 Найти цитируемый пост)
auto_ptr ... лишний. 

позвольте узнать, чем он вам не угодил ?


Автор: ИванМ 2.9.2010, 16:36
Цитата(mes @  2.9.2010,  16:23 Найти цитируемый пост)
позвольте узнать, чем он вам не угодил ?

Мое мнение такое, что разные части одной библиотеки (под библиотекой подразумеваю всю библиотеку C++ вообще) должны гармонично взаимодействовать друг с другом. А auto_ptr не хочет дружить с контейнерами. Поэтому, ИМХО, его в топку. smile 
Знаю что есть мнения, что для каждого свое предназначение, но для меня это не аргумент. Пользуюсь boost и доволен. Вот shared_ptr, ИМХО, надо стандартизировать.

Автор: mes 2.9.2010, 16:42
Цитата(ИванМ @  2.9.2010,  15:36 Найти цитируемый пост)
. А auto_ptr не хочет дружить с контейнерами. Поэтому, ИМХО, его в топку. 

он дружит показывая (на нормальных компиляторах)  контейнеру то, что его нельзя в нем хранить smile


Цитата(ИванМ @  2.9.2010,  15:36 Найти цитируемый пост)
Вот shared_ptr, ИМХО, надо стандартизировать. 

уже...

 только ведь шаред предназначен для несколько инхых задач smile

Автор: ИванМ 2.9.2010, 16:51
Цитата(mes @  2.9.2010,  16:42 Найти цитируемый пост)
он дружит показывая (на нормальных компиляторах)  контейнеру то, что его нельзя в нем хранить

Цитата(mes @  2.9.2010,  16:42 Найти цитируемый пост)
 только ведь шаред предназначен для несколько инхых задач 

Это как раз тот аргумент, о котором я говорил. Объясню мое мнение. shared_ptr можно использовать везде, где используется auto_ptr. А дополнительные накладные расходы - актуально, но 10 лет назад.

Добавлено через 1 минуту и 23 секунды
Цитата(mes @  2.9.2010,  16:42 Найти цитируемый пост)
уже...

Уже вышел стандарт 0x?
Или это ухмылка? smile 

Автор: Master01 2.9.2010, 21:11
а вот интересно зачем в бусте наряду с shared_ptr предлагают также и scoped_ptr - это ведь вроде такие же non-copyable указатели?

и ещё насчёт контейнеров - по идее  они должны дружить с intrusive контейнерами, которые хоть и являются гораздо менее востребованными чем обычные контейнеры, но в некоторых ситуациях просто не заменимы. (хотя они вне стандарта)

на самом деле я  auto_ptr тоже редко использую, поэтому и промахнулся с массивом smile

а ещё похоже что гуру С++ по этому вопросу тоже не сошлись - помниться Мейерс рекомендовал бежать от них как от огня, так же как и от vector<bool>, но зато у Александреску в "Современном проектировании"  в примерах иногда auto_ptr проскакивали.... (as I remember)


Автор: alexvs11 2.9.2010, 21:55
Цитата(Master01 @  2.9.2010,  15:14 Найти цитируемый пост)
то значит это неспроста и она что-то там меняет, а раз так то это может нарушить целостность контейнера ...

как то маловероятно, но даже так, в 99% c_str вернет указатель на внутреннее представление строки, а оно по стандарту должно линейно представлятся в памяти, вообщем ничего не будет smile 

Автор: Master01 2.9.2010, 22:32

маловероятно по сравнению с чем? что это за оценка такая 99%? кем и как измеренно? почему вы думаете что дл ямоей задачи это приемлемо? а что произойдёт в оставшийся один процент? smile

настораживает тут не то, что модификация не пройдёт, а как раз обратное ...

Автор: alexvs11 2.9.2010, 22:35
Цитата(Master01 @  2.9.2010,  22:32 Найти цитируемый пост)
маловероятно по сравнению с чем? что это за оценка такая 99%

то что реализация библиотеки поместит строку в защищенную область памяти и при работе произойдет крах например

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)