| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Функция, возвращающая любой тип данных? |
| Автор: maq 19.2.2006, 19:05 | ||
| У меня такая проблема: Нужно создать функцию, которая в зависимости от обработки (в теле самой функции), будет возвращать различные типы данных, например:
Кто-нибудь может помочь? |
| Автор: Mayk 19.2.2006, 19:15 |
| Хмм. При сильном желании HBITMAP и HICON можно откастить в HANDLE. Только надо ли оно? Ну еще можно использовать union'ы, или модный ныне http://boost.org/doc/html/any.html ps. не стоит писать break после return'а. такой break никогда ничего не прервёт. |
| Автор: kanSC 20.2.2006, 00:27 |
| Пусть функция возвращает void*. А после вызова приводи возвращаемое значение к нужному тебе типу. |
| Автор: chipset 20.2.2006, 01:38 |
| Отставить отрывание рук Не нужно большого желания. HBITMAP и HICON это typedef'ы HANDLE. Добавлено @ 01:40 Если-же нужна реализация фабрики обьектов для других типов то: 1. Создаем базовой обьект с виртуальной функцией. 2. В switch'e наполняем вирт. функцию содержимым. 3. Возвращаем полиформно измененный обьект. |
| Автор: maq 20.2.2006, 20:03 | ||||||||
| DeadSoul, chipset, а если по-подробнее, пожалуйста. И если можно с примером... Пробовал с VARIANT:
ошибка: Error 1 error C2664: 'tagVARIANT::tagVARIANT(const tagVARIANT &)' : cannot convert parameter 1 from 'HBITMAP' to 'const tagVARIANT &' c:\.....\rsplash.cpp 251
теперь уже уйма ошибок! (кажется ошибка синтаксиса) |
| Автор: Mayk 20.2.2006, 20:22 | ||
|
| Автор: DeadSoul 20.2.2006, 23:32 |
| Фигню сморозил. Как-то забыл о том, что это все typedef-ы для void* maq, я бы подумал над разнесением этой функции на несколько |
| Автор: chipset 20.2.2006, 23:51 |
| Зачем? |
| Автор: DeadSoul 21.2.2006, 00:44 |
| chipset, а как с ней извне работать? Ты не знаешь, что там HICON,HBITMAP(а Api разные) А внутри функции все равно switch\что-то shitch-е подобное |
| Автор: bel_nikita 21.2.2006, 00:53 | ||
Ну вот, такое извращение:
|
| Автор: DeadSoul 21.2.2006, 01:47 |
| bel_nikita, RETVALUE -> std::pair<...> |
| Автор: maq 21.2.2006, 19:50 | ||||||
Задача такая вот:
Error 1 error C2664: 'CStatic::SetBitmap' : cannot convert parameter 1 from 'HANDLE' to 'HBITMAP' |
| Автор: Earnest 21.2.2006, 20:07 | ||||
| Можно применить насилие (HBITMAP)LoadFromRes(...) Однако с точки зрения объектного программирования, это не очень хорошо, лучше бы как-то так:
Использование:
Т.е. вместо одной утилитной функции используем один утилитный класс. Добавлено @ 20:08 Да, забыла, в деструкторе библиотеку нужно выгрузить. |
| Автор: maq 22.2.2006, 00:28 | ||
Earnest, мне нужна именно функция
которая в зависимости от задаваемого параметра intResType (DST_BITMAP или напр. DST_ICON и т.д) возвращала бы HBITMAP или HICON. Вместо твоего варианта я бы лучше разделил функцию LoadFromExtRes на LoadBitmapFromExtRes и LoadIconFromExtRes, которые возвращали бы HBITMAP и HICON. Мне нужно просто объединить эти функции. Но вот как? |
| Автор: bel_nikita 22.2.2006, 01:50 | ||
Ничего не нужно объединять. Каждая функция должна выполнять минимум. И оператор if...else... еще никто не не отменял |
| Автор: maq 22.2.2006, 10:11 | ||
| bel_nikita, нужна ОДНА-ЕДИНСТВЕННАЯ функция. Создать функции HBITMAP LloadBitmapFromExtRes HICON LoadIconFromExtRes - нет проблем! Мне же нужна одна функция LoadFromExtRes, которая бы возвращала либо HBITMAP, либо HICON (в зависимости от
|
| Автор: maq 22.2.2006, 16:59 | ||
Почему? |
| Автор: Earnest 22.2.2006, 21:14 |
| Почему? Но если действительно нужна именно функция, и именно одна - тогда возвращай HANDLE и используй преобразование типа при использовании. Другого выхода нет. Если ничего не перепутаешь (т.е. не попытаешься использовать HICON вместо HBITMAP), все должно работать. |
| Автор: chipset 22.2.2006, 21:24 |
| ИМХО, стоит сделать оболочку ImageProcessor с виртуальной функцией ProcessImage и в LoadBitmapFromExt присваивать классу в ран-тайме либо обьект HIconImageProcessor либо HBitmapImageProcessor. Другого красивого метода я не вижу. |
| Автор: maq 23.2.2006, 13:26 | ||||||||
Earnest, ты это имеешь ввиду - заменить
на
Я правильно понял? P.S.
Просто для интереса - а почему "не очень хорошо"? |
| Автор: Earnest 23.2.2006, 18:52 |
| Да, ты понял правильно. Только не худо бы проверить, что возвращенный хандл != 0. Нехорошо, потому что небезопасно: после выхода из LoadFromExtRes, по хандлу уже никак нельзя установить, что это - иконка или битмап. Т.е. от того, с какой константой вызвали LoadFrom... зависит, что будет делаться дальше. Лучше бы такие действия объединить намертво... Не могу понять, чем тебе так мила единая функция? |
| Автор: Coocky 23.2.2006, 19:14 | ||
| Долго наблюдал. Снимаю рубаху, кидаюсь в рукопашную
Сильно заООПепил На самом деле-решений-множество Вот у меня вопрос к автору-толкнуть все в одну функцию-это чисто из любопытства или жизненое кредо? |
| Автор: maq 23.2.2006, 22:44 | ||||||||||
Все отлично работает.
Предусмотрено уже (например):
Люблю простоту написания кода. А всю рутинную работу бросить в отдельную функцию. (наверное привычка от VB) Спасибо за помощь! |