In unserem Code-Basis haben wir viele Konstruktionen wie folgt aus:Sicherer Zeiger Dereferenzierung in C++
auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)
In 99,99% der Fälle diese Prüfung ausgelöst wird, nicht. Ich denke an die folgende Lösung:
auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)
Wo deref_or_throw
wie folgt erklärt:
template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}
Dieser Code viel klarer ist und funktioniert wie ich brauche.
Die Frage ist: erfinde ich das Rad neu? Gibt es eine verwandte Lösung in Standard oder Boost? Oder haben Sie Kommentare zur Lösung?
PS. Verwandte Fragen (ohne zufriedenstellende Antwort): Is there a C++ equivalent of a NullPointerException
Gibt es überhaupt einen Code, der sich tatsächlich mit dem 'nullptr'-Fall befasst? Z.B. alles wie 'if (! obj) {std :: cout <<" Null, aber immer noch okay, mach weiter mit etwas Bedeutungsvollem \ n "; } else {std :: cout << "Non-Null, etwas anderes tun \ n"; } '. Oder ist der 'nullptr'-Fall immer ein" exit, weil das falsch ist "-Pfad? – stefan
Dieser Code existiert, ist aber selten. In den meisten Fällen können wir einfach nicht fortfahren. Nichts, was wir tun können. Die ganze Routine ist bedeutungslos. Also vielleicht Existenz dieses Objekts ist eine _precondition_? Und ich muss es überprüfen und dann den Zeiger manuell dereferenzieren, ohne sich Sorgen zu machen? – Mikhail
Genau das müssen Sie für sich selbst klären, imho. Wenn es eine Vorbedingung ist, ist vielleicht eine 'Behauptung' besser geeignet. Ansonsten ist dies eindeutig eine Ausnahme (0,01% ist ziemlich außergewöhnlich), so dass eine "Ausnahme" angebracht ist. Afaik, in einer Bibliothek gibt es so etwas nicht. – stefan