В нашей базе кода у нас много таких конструкций:
auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)
В 99,99% случаев эта проверка не запускается. Я думаю о следующем решении:
auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)
Где deref_or_throw
объявляется следующим образом:
template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}
Этот код намного яснее и работает по мере необходимости.
Вопрос: я изобретаю колесо? Есть ли какое-то смежное решение в стандартном или импульсном режиме? Или у вас есть некоторые комментарии к решению?
PS. Связанный с этим вопрос (без удовлетворительного ответа): Есть ли эквивалент С++ для исключения NullPointerException