C++: как выбрать тип переменной во время выполнения? |
Здравствуйте, гость ( Вход | Регистрация )
C++: как выбрать тип переменной во время выполнения? |
mezmay |
21.7.2009, 9:28
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: 1 |
Проблема такая: хочу создать класс для обработки массивов чисел. Элементами могут быть вещественный или комплексный short, int, float, double. Программа должна работать примерно так: открываю файл, выбираю тип данных (например, комплексный float) и делаю необходимые преобразования массивов. Вопрос: как хранить прочитанный массив в классе? если например создать поле void *data и после открытия делать myObject.data = new scplx[n]; - то как передавать тип в методы? можно конечно создать enum types{ INT, FLOAT, ...} и в каждом методе делать switch (TYPE){ case INT: ..... case FLOAT: ...} но так слишком много case'ов придется везде вставлять. Есть ли какое-то нормальное решение этой проблемы?
вроде бы для подобных целей существуют шаблоны, но опять же - как задать шаблону тип во время выполения? |
|
|
AD |
21.7.2009, 9:38
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
насколько я знаю, эту проблему можно решить ДАЖЕ на этапе компиляции, а не на этапе выполнения с помощью списков типов. Александреску подробно описывает эту штуку.
Посмотрите в интернете информацию о библиотеке Loki, где они реализованы. Возможно, подойдут. Она бесплатна для скачивания. Основная структура выглядит так:
Ну а остальное почитайте у Александреску, посмотрите исходники библиотеки. (Сам сегодня ее собрал - собралась без проблем, только список предупреждений - что нестрашно! ) Сообщение отредактировал AD - 21.7.2009, 10:15 |
|
|
kwisp |
21.7.2009, 10:02
Сообщение
#3
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
mezmay |
21.7.2009, 13:46
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: 1 |
а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая?
|
|
|
kwisp |
21.7.2009, 13:53
Сообщение
#5
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
я думаю что да - хорошая, но зависит от уровня подготовки читателя.
П.С. вопрос касательно литературы обсуждается в другой ветке форума. так что лучше писать туда, а то модератор ругаться будет. |
|
|
AD |
21.7.2009, 14:04
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Цитата(mezmay) а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая? Я сейчас ее читаю. Книга полезная, интересная, но читать немного сложновато. Говорят, что читать ее проще, если знаешь функциональные языки программирования. |
|
|
D_K |
21.7.2009, 15:20
Сообщение
#7
|
Студент Группа: Участник Сообщений: 20 Регистрация: 20.5.2009 Пользователь №: 761 Спасибо сказали: 3 раз(а) Репутация: 1 |
mezmay, а как собираешься использовать сие творение? Можно псевдокодом. От этого многое зависит.
Перед тем, как разбираться в том, как делать, нужно понять что конкретно ты хочешь сделать Я сейчас ее читаю. Книга полезная, интересная, но читать немного сложновато. Говорят, что читать ее проще, если знаешь функциональные языки программирования. Так списки типов и есть, фактически, функциональное программирование
|
|
|
igor_bogomolov |
21.7.2009, 19:17
Сообщение
#8
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
mezmay,
а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая? Как сказал Kwisp, зависит от уровня читателя. Я так же пытаюсь ее освоить. Мозги скрипят, аж до соплей прошибает. Тяжело дается освоение. Но в отличае от GoF, с ее помощью я действительно продвинулся в решении своей задачи (см. соседнюю тему)По вопросу вобщемто уже все подсказали. См. 8 главу книги Александреску -"Фабрики объектов". Там как раз описывается то что ищешь. Сообщение отредактировал igor_bogomolov - 21.7.2009, 19:23 |
|
|
AD |
21.7.2009, 19:26
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
|
|
|
AD |
27.7.2009, 21:04
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
По иронии судьбы, встала та же задача, только типы не стандартные, а свои - пользовательские. Использовал Loki. Смысл такой: чтение заголовка карты, в зависимости от типа заголовка. Вот такой код получился (понимаю, не самый удачный код, но не закидывайте, пожалуйста, камнями - я только учусь! )
Думаю, чем-то поможет. Функция Field<index>() - берет соответствующий тип. Насколько я понимаю, если функцию сделать шаблонной, то можно будет и упростить код. К сожалению, след. трюк не прошел:
Для того, чтобы такая конструкция сработала index должен иметь тип T. |
|
|
Текстовая версия | Сейчас: 29.11.2024, 16:34 |