2016-10-31 6 views
-2

戻り値の型としてstructを使用するコードがあります。私は構造体のnullインスタンスをエラーとして返したいが、エラーではないときは構造体の逆参照型を返す。関数全体で1つのリターンのみを使用してこれを行うにはどうすればよいですか?はい、それは2つのリターンを使用するのは非常に簡単ですが、私は1つのリターンを使用する必要があります。データ型に1つのreturnを使用してエラーを返すにはどうすればよいですか?

+1

あなたがやろうとしているものの例を追加した場合、それは良いだろう。 – HazemGomaa

答えて

0

戻り誤差として構造体のヌルインスタンスが、構造体の間接参照のバージョンではないエラーを返します。

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

ヌルインスタンスでデフォルトを意味しない場合

は、あなたは(Boostライブラリからの)C++ 17 std::optional、または boost::optionalを使用することができ、1に初期化。または、あなた自身の素早く汚いものを巻くことができます Optional。あなたは効率性を無視することができたとき、それはまったく難しいことではありません。

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)); } 
}; 

免責事項:コードは、コンパイラの手で触れていません。

+0

私はプログラミングに慣れていません。 is_errorはC++のマクロでビルドされていますか?もしそうなら、どんなヘッダーですか?ありがとう! – teenHere

+0

@teenHere:いいえ、組み込みではありません。それは単なる例です。 –

0

機能全体で1回のリターンを使用してこれを行うにはどうすればよいですか?あなたは、例えば、C++ 17(又はBoost.Optional)のでstd::optionalを使用することができ

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

その後、

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

'std :: C++ 17 'よりも低い場合、[' boost :: qptional'](http://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/)を使うことができます。 index.html)(ヘッダーのみのlib)。 –

関連する問題