Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GUID from std::string, преобразование std::string -> guid 
:(
    Опции темы
Master01
Дата 1.9.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2




Ребята, кто-нибудь может подсказать есть ли вменяемый способ преобразовать строку в 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 не предлагать
PM MAIL   Вверх
jonie
Дата 1.9.2010, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



UuidFromString функция есть.
Цитата


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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
alexvs11
Дата 1.9.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



кхм

Код

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

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

Это сообщение отредактировал(а) alexvs11 - 1.9.2010, 22:50
PM MAIL   Вверх
ИванМ
Дата 1.9.2010, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Рекомендую простой способ:
Код

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

PM MAIL   Вверх
Master01
Дата 2.9.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2




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

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

Код

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

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

CLSIDFromString(wc_str, guid);


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


всем спасибо


PM MAIL   Вверх
ИванМ
Дата 2.9.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



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

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

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

Я посмотрел в MSDN эту функцию - первый параметр - IN. Поэтому и предложил. Хотя, возможно, я неправ.
PM MAIL   Вверх
Master01
Дата 2.9.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2




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

кстати, я вверху прогнал насчёт auto_ptr и массивов, но не суть важно
PM MAIL   Вверх
ИванМ
Дата 2.9.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



А вот к auto_ptr у меня личная неприязнь. Я вообще придерживаюсь мнения, что в стандарте c++ он лишний.
PM MAIL   Вверх
mes
Дата 2.9.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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




--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 2.9.2010, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



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

Мое мнение такое, что разные части одной библиотеки (под библиотекой подразумеваю всю библиотеку C++ вообще) должны гармонично взаимодействовать друг с другом. А auto_ptr не хочет дружить с контейнерами. Поэтому, ИМХО, его в топку. smile 
Знаю что есть мнения, что для каждого свое предназначение, но для меня это не аргумент. Пользуюсь boost и доволен. Вот shared_ptr, ИМХО, надо стандартизировать.
PM MAIL   Вверх
mes
Дата 2.9.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


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

уже...

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


Это сообщение отредактировал(а) mes - 2.9.2010, 16:43


--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 2.9.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 1
Всего: 23



Цитата(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 
PM MAIL   Вверх
Master01
Дата 2.9.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2



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

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

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

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


PM MAIL   Вверх
alexvs11
Дата 2.9.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



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

как то маловероятно, но даже так, в 99% c_str вернет указатель на внутреннее представление строки, а оно по стандарту должно линейно представлятся в памяти, вообщем ничего не будет smile 
PM MAIL   Вверх
Master01
Дата 2.9.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2




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

настораживает тут не то, что модификация не пройдёт, а как раз обратное ...
PM MAIL   Вверх
alexvs11
Дата 2.9.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



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

то что реализация библиотеки поместит строку в защищенную область памяти и при работе произойдет крах например
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.