2016-05-11 13 views
0

私は、結果とエラーのいずれかを運ぶことができる単純な構造体を持っています。 どちらも同じタイプですが、分かりやすくするために2人のメンバーが必要です。 cppreference.comから、次のコードスニペットが有効なC++であるようです。 non trivialクラス(このインスタンスではstd :: string)を整理するために、ユニオンデストラクタで配置を削除します。ユニオンはC++で、単純な型ではありません

struct Result { 
    union { 
    std::string resultText; 
    std::string errorText; 
    ~(){ resultText.~string();} 
    }; 
}; 

それはのように見えますが、これを使用することを含む構造体は、明示的/コピーresultTextを移動するルールの-5のメンバーを実装する必要があります。

+4

これは労働組合のために、このような奇妙なユースケースである - 単一のプライベート文字列と(getResultText() 'と' getErrorText() ''のような)2つのゲッターが悪いのでしょうか?デバッグ専用のフラグを追加して、正しいテキストを取得していることを確認することもできます。 –

+0

また、結果がエラーまたは実際の結果であることを示すために、 'std :: string'と' bool'(またはenum)を持つ単純な構造体を持つこともできます。 @VittorioRomeoに同意する必要があります。そのために組合を使用するのは非常に奇妙な考えです。 –

+0

ところで、あなたの構造体は実際には、実際に組合体から何を使用するかの弁別者を逃してしまいます。 –

答えて

1

ユニオンはコードの可読性を低下させるだけです。また、使用方法によってはメンテナンスも増えます。実際には、std::stringのメンバーを持っているにも関わらず、「5のルールを実装する」と述べたという事実は、あなたのクラスが維持する悪夢となることを示唆しています。

私は、これらのオプション(最高どのようになるかを決定するために問題のない十分な詳細)になります。

  • は例外を使用してください。 std::exception

  • Boost.Optionalを使用してカスタム例外を作成できます。

    boost::optional<std::string> do_something() { ... }; 
    
    std::string result = do_something().value_or("error!"); 
    
+0

'std :: optional'は、最新のC++標準にはまだ存在していないと言いたいかもしれません。 – user2079303

関連する問題