2015-12-11 17 views
5

this questionと本質的に同じですが、C++では同じです。割り当てる変数を条件付きで選択できますか?

これを実行する最も簡単な方法は、次のようになります。

if (condition) { 
    a = f(x); 
} else { 
    b = f(x); 
} 

これは私のニーズを満たしているが、それは常に私がF(X)を入力して二回、ないに拡大言及繰り返さなければならなかったことを私に盗聴されています1行だけが実行されると、非常に多くの行にコードが出力されます。どのような目的地変数を選択するのですか?

switch(condition variable) { 
case 1: 
    var1 = f(x); 
    break; 
case 2: 
    var2 = f(x); 
    break; 
... 
case y: 
    vary = f(x); 
    break; 
} 

これは私にとって非常に控えめです。

C++には、基本的に次のことが可能なものはありますか?

私はそれが左辺値と呼ばれていない場合、私はまだC + +に比較的新しいです。しかし、皆さんは私が何を意味するかを知っています。値を割り当てる目的変数です。

+0

あなたは確かに参照を返し、それに割り当てる関数を書くことができます。 –

+0

どうすればいいですか?どのような関数の戻り値の型はどのように見えますか? – thegreatjedi

+0

質問に対する直接的な答えではありませんが、 'fval = f(x); if(条件)a = fval; else b = fval'はまだDRYされていますが、わかりやすいです。 – Amadan

答えて

8

あなたが形成でき、

std::get<constexpr_indexer()>(std::tie(var1, var2, var3, var4)) = f(x); 

std::get参照または割り当てたい変数へのポインタです。

(condition ? a : b) = f(x); // reference 

上記のバージョンでは、コメントにascheplerによって示唆されました。

*(condition ? &a : &b) = f(x); // pointer 

参考バージョンは、基本的に、ヘルパー機能を使用する次のより冗長な例と同等です。

template <typename T> 
T& 
conditional_reference(bool pred, T& yes, T& no) noexcept 
{ 
    return pred ? yes : no; 
} 

// And then later 

conditional_reference(condition, a, b) = f(x); 

私のポイントは、あなたの伝統的なifその後、else制御フローは、コード明確にするという点ではまだ、おそらく最良の選択であるということです。

代入元がf(x)よりも複雑な式の場合は、その結果を一時変数に格納し、その変数のみを条件式に代入することができます。 C++ 11の移動セマンティクスは、多くの場合、そのような一時変数の使用を許容します。

+3

'a'と' b'の型が同じなら、普通の古い '(条件?a:b)= f(x);'が実行します。 – aschepler

+0

@aschepler正直なところ、私はこの作品がちょっと驚きましたが、それを考えています。私はそれを覚えています。 – 5gon12eder

+0

これはおそらく私が探している正確な解決策です。ありがとう!私はこれを答えとして受け入れます。 – thegreatjedi

6

あなたはコンパイル時に割り当てるためにどの変数を決めることができれば、あなたは、この非常にきれいで、ゼロ・オーバーヘッド・アプローチで逃げることができます:std::tie

+0

この回答ありがとう!残念ながらコンパイル時間に制限されているにもかかわらず、この1つは特に知っていると非常に良いと思う。あまりにも複数の答えを選ぶことはできません。 – thegreatjedi

2

switch文にポインタ変数(double * pなど)を割り当てることができます。

switch(condition variable) { 
case 1: 
    p = & var1; 
    break; 
case 2: 
    p = & var2; 
    break; 
... 
case y: 
    p = & vary; 
    break; 
} 

これは、文を切り替えた後に行うことができます。

*p = f(x); 
+0

これは実際に問題を解決するものではありません。今度は、左側のポインタ変数を使ってswitch文を実行します。それは本質的に同じことです。私の質問は、switch文を避けることができ、同じ機能が1行に統合されているかどうかです。 – thegreatjedi

+0

@thegreatjediあなたは5gon12ederが提案したように三項演算子を使うことができます。しかし、それ以上の2つの条件とコードは読めなくなるでしょう。 –

0

リンク先の質問と同様、まだXY problemです。なぜこれが必要ですか?単純なif/else条件よりも潜在的に読めなくなり、維持が困難なコードを書くのはなぜですか?しかし、問題の核心は、どのような正当なシナリオで同じ値を持つ26のアルファベットの変数があるでしょうか?

オリジナルの質問(バイナリ検索ツリー)に似たシナリオがない限り、1つの変数を使用してください。

DRY unrelated, but nearly identical, codeをお読みください:

誰かがどこかでそれを行うには良いことだという本の中でそれを書いたので、あなたはDRY行わない、それは実際に具体的なメリットを持っているので、あなたがDRY行います。

+0

@Downvoters "DRY"を避ける以外に、OPが実際に望んでいることの明確な指定がない回答の可変性を見ることは、 "あなたが求めているものが不明"または "広すぎる"という強い兆候です。 – user5666873

+0

質問が「広すぎる」と思っている場合や「質問しているものが不明」と思われる場合は、質問の絞り込みまたは明確化を依頼し、問題が解決しない場合は、結果的に広範な、または不明な回答を投稿することは口実ではありません。しかし、私はあなたの答えが下投票に値するとは思わなかった。 – 5gon12eder

+1

私がやりたいことが「どの変数を割り当てるかを選択する」という異なるプログラム間でインスタンスが発生しました。どの変数の値を使用するかを選択するさまざまな方法があることを知っています。したがって、当然のことながら、私はその必要性に日常的に遭遇したのと同じように、その逆も真実です。私にはswitch case case文のようなものが、異なるcaseがかなり異なるコードを持つときに使用されるべきであり、n回の文が繰り返されるべきではない。私は今ここで一つの問題を解決することを求めているのではなく、どのような技術が私に利用可能であるか学ぶことです。 – thegreatjedi

関連する問題