2016-10-31 2 views
-2

Ich habe Code, der eine Struktur als Rückgabetyp verwendet. Ich möchte eine Null-Instanz der Struktur als Fehler zurückgeben, aber die Dereferenzierungsversion der Struktur zurückgeben, wenn kein Fehler vorliegt. Wie kann ich dies mit nur einer Rückgabe in der gesamten Funktion tun? Ja, es ist sehr einfach, zwei Returns zu verwenden, aber ich muss nur einen Return verwenden.Wie verwendet man eine Rückgabe für einen Datentyp, um einen Fehler zurückzugeben?

+1

wäre es besser, wenn Sie ein Beispiel hinzufügen, was Sie zu tun versuchen. – HazemGomaa

Antwort

0

Rückkehr eine Null-Instanz der Struktur als Fehler, aber die dereferenzieren Version der Struktur, wenn sie nicht einen Fehler zurück.

return (is_error? S() : *pointer_to_struct); 

Wenn von Instanz null Sie bedeuten keine Standard initialisiert ein, dann können Sie einen C 17 ++ verwenden std::optional oder ein boost::optional (von der Boost-Bibliothek). Oder Sie können Ihre eigenen schnellen und schmutzigen Optional rollen. Wenn Sie die Effizienz ignorieren können, ist es überhaupt nicht schwer:

template< class Wrapped > 
class Optional 
{ 
private: 
    vector<Wrapped> data_; 
public: 
    auto is_empty() const -> bool { return data_.empty(); } 

    auto ref() -> Wrapped& { return data_.at(0); } 
    auto ref() const -> Wrapped const& { return data_.at(0); } 

    Optional() {} 

    Optional(Wrapped value) { data_.push_back(move(value)); } 
}; 

Haftungsausschluss: Code nicht durch Hände des Compilers berührt.

+0

Ich bin neu in der Programmierung. Ist is_error ein in C++ geschriebenes Makro? Wenn ja, in welchem ​​Header ist es? Vielen Dank! – teenHere

+0

@teenHere: Nein, es ist nicht eingebaut. Es ist nur ein Beispiel. –

0

Wie kann ich dies mit nur einer Rückkehr in der gesamten Funktion tun?

Sie können std::optional seit C verwenden ++ 17 (oder Boost.Optional), z.B.

std::optional<some_struct> foo() { 
    if (...) 
     return something; 
    else // error 
     return {}; 
} 

dann

if (auto result = foo()) { 
    // use result.value() to get some_struct 
    // ... 
} else { 
    // error 
} 
+0

Unterhalb von 'std :: C++ 17' können Sie [' boost :: qptional'] verwenden (http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/ index.html) (nur Header-Bibliothek). –

Verwandte Themen