Huldra
> Если значение за пределами диапазона значений enum будет скастовано к enum,
> будет UB.
Если сделать
MyClass *my_class = nullptr; my_class->method();
То произойдёт УБ. Запретишь теперь методы? Логика то точно такая-же. И пример кода тоже.
modmaker1
> Если ты конвертируешь в enum рандомные данные, то надо делать проверку на их
> валидность.
> Мне кажется, со всеми этими перделками, навроде static_cast, проггеры забыли,
> что значит кодить тщательно.
> Для проверки соответствия рандомных данных валидному значению потребуется
> runtime проверка. static_cast тут просто ничем не может помочь.
Вообще умные люди придумали всякие protobuf, чтобы автоматически читать из файла и проверять на соответствие.
ТС же просто не умеет код нормально писать.
Известно же что енам это гарантия того, что значение может быть только одним из перечисленных. Он же просто делает static_cast в енам не проверив его значение. И после того как C++ показывает что подобный говнокод УБ, ТС решает что енамы зло и уб.
samrrr
> Известно же что енам это гарантия того, что значение может быть только одним из
> перечисленных.
Вот в этом разница между enum и enum class, насколько я понимаю. Ты описываешь enum class, а просто enum в C++ это тип позволяющий вместить любое из значений enum и набор констант, которые для удобства можно использовать вместо чисел.
Huldra
> а просто enum в C++
это наследие C не выпиленное для совместимости.
enum{ DELETE_WORLD, CREATE_WORLD }; enum{ CREATE, DELETE }; int do_operation=CREATE; if(do_operation==DELETE_WORLD){ //... }
Но ты этого видимо не понимаешь.
samrrr
Ну да, с точки зрения API это ужасно, соглашусь
Huldra
> ну да
Тут я бы сказал помощь даже вредна.
Во-первых, аппаратные спрайты - для человека знающего GAPI - это дел на 1 вечер (с генерацией атласов на лету - на 2 вечера)
Во-вторых, движок то твой. Ты хочешь его как-то "по своему" писать. Поэтому 1 вечер рискует превратиться в неделю, чтобы тебе все понравилось.
В-третьих, тебе стоит самой научиться в графические апи. Это даст тебе понимание того, почему никто не протягивает в движки функционал "поменять пиксель по координатам XY". И почему другие движки такие, какие есть, а не такие, как хочется тебе. И лучший способ этому научиться - набить собственные шишки (особенно с учетом твоего характера).
samrrr
> Он же просто делает static_cast в енам не проверив его значение
Я просто подумал, они полагают, что static_cast это сделает за них. :D
Кстати, не уверен насчет dynamic_cast , вроде это как раз runtime-проверка, и в теории может работать.
modmaker1
> Кстати, не уверен насчет dynamic_cast , вроде это как раз runtime-проверка, и в
> теории может работать.
dynamic_cast только с указателями работает. В C++ нет рефлексии а значит проверки на принадлежность числа к енаму нет и быть не может.
Такчто остаётся использовать протобаф и нагенеренную им рефлексию.
samrrr
> В C++ нет рефлексии а значит проверки на принадлежность числа к енаму нет и
> быть не может
Честно ни разу не пробовал (поскольку предпочитаю все делать ручками), но в теории, для такой проверки не нужно знать тип, код для проверки принадлежности числа к заданному диапазону может быть добавлен на этапе компиляции.
modmaker1
> Честно ни разу не пробовал (поскольку предпочитаю все делать ручками), но в
> теории, для такой проверки не нужно знать тип, код для проверки принадлежности
> числа к заданному диапазону может быть добавлен на этапе компиляции.
Как будет рефлексия....
samrrr
> Как будет рефлексия....
Ну, я так понимаю, информация о типах, доступная приложению в runtime. По кр. мере гугл говорит за это. Если это вопрос, конечно. :)
Суть того что я написал в том, что dynamic_cast мог бы быть раскрыт в код проверки диапазона допустимых значений in-place:
a = dynamic_cast<MyEnum>(b);
в:
if ( b < MyEnum.min || b >= MyEnum.max )
Error
Чисто в теории, поскольку я написал, что не знаю.
MyEnum min и max эвальюируются на этапе компиляции, поэтому информация о типах (в runtime) не нужна.
modmaker1
> MyEnum min и max эвальюируются на этапе компиляции, поэтому информация о типах (в runtime) не нужна.
Ммм а что по енаму со значениями -20, 0, 10000?
samrrr
> а что по енаму со значениями -20, 0, 10000?
Компилятору ничто не мешает генерировать код отвечающий структуре enum-а. Мин и макс это чисто для примера.
modmaker1
> Компилятору ничто не мешает генерировать код отвечающий структуре enum-а. Мин и
> макс это чисто для примера.
Компилятору ничего не мешает поддержать рефлексию. Всеголишь надо имена полей, функций, и енамов отдать программе. Только вот этого досихпор так и не произошло. Зато в бууст завезли describe.
samrrr
Может вы и правы.. Хотя мне лично до сих пор этого не было нужно.