![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| proc_maker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: нет Всего: 1 |
Вот написал такой вот кусочек кода, однако столкнулся с траблом проверки соответствия типов данных на этапе компиляции.
Например, использование var2_int должно вызывать ошибку компиляции поскольку тип переменной, возвращаемой ключем определен как double. Подскажите плз чего бы наколдовать (я думаю в функции getValue() перед кастом); Спасибо, Дмитрий
Это сообщение отредактировал(а) proc_maker - 11.8.2010, 12:45 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ничего ты тут с кастом не наколдуешь без дополнительной информации.
И вообще, налицо какие-то логические странности: с одной стороны, ты забиваешь в массив переменные различного типа по индексам, а при выборке хочешь получить конкретный тип по имени... Или массив заполняется просто для отладки? Кроме того, такая форма, что шаблонный тип только в возвращаемом значении крайне неудобна - не сможешь ты написать double val = getValue ("bla-bla-bla"). Насколько я понимаю, задача состоит в том, чтобы сделать именованные переменные произвольного типа. Во-первых можно просто использовать boost::any (только добавить туда имя). Во-вторых, если хочешь собственный велосипед, нужно добавить информацию. Самый простой способ - хранить вместе со значением тэг типа. По ходу, как ты хочешь добывать значение, перебирая все переменные и приводя их к нужному типу, по другому и не получится, т.к. тип не динамический, а статик-каст тебе приведет... И вовсе не при компиляции тебе нужна проверка, а в рантайме - по крайней мере, так из кода следует. Если бы при компиляции, то можно было нарисовать какие-нибудь доп. шаблонные классы свойств, но тогда так как у тебя - писать нельзя. -------------------- ... |
|||
|
||||
| proc_maker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: нет Всего: 1 |
Надо сделать сохранение-восстановление настроек программы. Я привел пример для трех переменных разных типов, которые сохраняются в файле вида:
variable1 = 123 variable2 = 3.141592645 variable3 = dima Очень не хочется чтобы клиентский код имел доступ к манипуляции с типами данных дабы избежать возможности написать что-либо похожее с var2_int, тоесть тупо перепутать тип данных. Если же и делать контроль в рантайме то все это должно быть напрочь скрыто внутри этой имплементации и недоступно клиенту. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Еще раз повторю, если задача сугубо практическая, посмотри на boost::any, а не изобретай велосипед. При попытке извлечь не тот тип бросается исключение, его модно перехватить и рулить дальше. Чтобы закрыть от клиентского кода, оберни сверху своим классом. В компил-тайм можно проверить только константные выражения, причем точно известные именно в момент компиляции, а в твоей задаче это не так.
-------------------- ... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |