Qraizer

Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору xdude Не надо воспринимать всякую юмористическую чушь, которую забыли положить в подкаталог Umor, так всерьёз. Ещё раньше появлялись подобные юморески про Unix и plain-С, причём про последний даже жёстче, чем тут про C++ - "Страуструп" тут хоть не обозвал всех C++ программеров дебилами. Новый стиль операторов кастования - в отличие от старого - не только говорит компилятору, какой тип должен получиться в итоге, но и уточняет, зачем тебе этого захотелось. Посмотри: Код: const int* pci; void f(const void*); /* ... */ f((char*)pci); | Тут на самом деле два преобразования: одно - снятие константности, второе - смена типа указателя. Возникает вопрос: что хотел программист? Три ответа: именно это и хотел; хотел только снять констанстность, но ошибся типом указателя, это нередко бывает при копипасте; хотел только привести тип указателя, но забыл модификатор const. У компилятора нет возможности определить точную конечную цель программиста, поэтому он должен выбрать наиболее общую стратегию поведения, т.е. первый вариант. Новый стиль кастования избавляет от этой недосказанности: static_cast<> - программист имел в виду сменить тип представления данных (оставив его значение неизменным); const_cast<> - программист хотел сменить cv-квалификаторы; reinterpret_cast<> - программист хочет сменить тип данных, не меняя его представления (очень часто это непереносимое кастование; например, char*, будучи откастован к float*, на многих платформах должен будет "выровняться" по кратности float, но не на x86; впрочем, и на x86 это может зависеть от параметров выравнивания, используемых компилятором; поэтому для этого оператора оставили такое длинное и неодобное имя - чтоб чисто психологически пореже хотелось им пользоваться). Кроме этого добавили dynamic_cast<> - для безопасного нисходящего приведения типов, аналога которому в совместимых способах нет, и его приходилось писать вручную или полагаться на авось. Так что теперь компилятор сможет расширит свою диагностику на случаи многих программистких ошибок, связанных с неверным кастованием и которые раньше были неочевидны. Цитата: ...Компилируется нормально, во время исполнения выкидывает эксепшн St8bad_cast... | Взять-то ты взял, а выкинул изнутри работу с русской локалью? Когда фасет std::num_get<> выбирается из локали, только там может такое произойти. Вообще не совсем понятно, как он у тебя скомпилится, если выкинуть только то, что ты указал. Там же ещё Ch был. Вообще, приведи полный код функции, который у тебя получился. Впрочем, могу попытаться такой вариант предложить: Код: template<class T> inline T from_string2(const std::string &str) { static ios_base::iostate st = 0; static std::stringstream ss; T ret_val; use_facet<num_get<std::string::value_type, std::string::const_iterator> >(ss.getloc()).get(str.begin(), str.end(), ss, st, ret_val); return ret_val; } |
|