возврата nullptr кидает исключение. В первом приближении что-то такое:
template <class TTo, class TFrom>
inline TTo safe_cast(TFrom* ptr)
{
TTo result = dynamic_cast<TTo>(ptr);
if(unlikely(result == nullptr))
{
DebugBreak();
throw std::bad_cast{};
}
return result;
}
но, дальше хочется, чтобы исключение содержало FILE LINE того места, где произошло кастование. Для этого вызов придется обернуть в макрос. Можно ли как-то сделать макрос, сохранив привычный синтаксис кастования?
B* result = safe_cast<B*>(a_ptr);
Так динамик каст эксепшн выбрасывает если ссылки кастишь. Получается смысл только в том чтобы номер строки передавать.
есть уже существующий код, который кастит указатели. С одной стороны их можно разыменовать. Но тогда нужно все равно перед этим проверить на null. Ну и плюс хочу номер строки, да
А какой стандарт С++?
Сделай каст макросом
это я понял. как синтаксис сохранить?
Шашечки или ехать?
ну то есть никак. так бы и написал
#define safe_cast Foo(__FILE__, __LINE__).do_cast
ОГОНЬ! спасибо. получилось ровно что я и хотел
Обсуждают сегодня