3

私は通常、何らかの状態を検出したいコードを持っており、それが存在する場合はその状態を処理します。

条件のテストは、問題の半分の処理にとって重要な特定の情報を抽出します。

ただし、if/else コンストラクトでは、if コンストラクト自体で local-to-the-if​​ 変数を宣言することはできません(1)。したがって、情報が抽出される可能性のあるさまざまな条件のすべてについて、if/else チェーン全体の開始前に変数宣言を配置する必要があります。

例えば:

    else if ((EndsWithToken("d") || EndsWithToken("dsh")) &&
             (p1 = find(m_input_line, '[')) &&
             (p2 = find(m_input_line, ']')) &&
              p2 > p1)
    {
                // process what we found inside of the [ ] brackets using p1 and p2...
            }

このスニペットは、if/else の長いチェーンの一部であり、他のスニペットは p1 と p2 を必要としませんが、入力ストリームから抽出された整数値、double、または 2 つのポイントなどが必要になる場合があります。 ...

ポイントは、 const TCHAR * p1 と p2 を上記のスコープにローカルに導入することを知っている方法はなく、それが使用される唯一の場所であり、構造全体が同じままであることを可能にします。

これを可能にする C++ 言語機能またはパターンはありますか?


(1) 一部の人が指摘しているように、それが最初のものであれば、基本型の単一の変数を宣言し、非ゼロに対してのみテストすることが可能です。これは、この問題の一般的な解決策としてはあまり役に立たないほど限定的です (ただし、時折、それが役立つ場面が現れることがありますが、非常にまれです)。

4

5 に答える 5

3

1 つの解決策は、各ケースを個別の関数にして、成功したかどうかを返すことです。

これにより、変数の自然で適切にローカライズされたスコープが得られ、うまくいけば (仮定すると) 合理的なコンパイラが変数をインライン化できます。

于 2012-11-08T16:00:30.650 に答える
2

ifandwhileステートメントでローカル変数を定義できます。ただし、ステートメントごとに宣言できるのは 1 つだけであり、ゼロ以外の値のみをテストできます。

...
else if (TCHAR *p1 = find(m_input_line, '['))
{
    if (TCHAR *p2 = find(m_input_line, ']'))
    {
        ...
    }
}

この場合、/ステートメントTCHAR *p1, *p2;のチェーンの前に宣言することもできますが、それには問題はありません。ifelse

于 2012-11-08T16:08:14.603 に答える
0

関数に抽出します。

bool validate(const string& line){
   auto startIndex = line.find('[');      
   auto endIndex = line.find(startIndex,']');
   return startIndex != -1 && endIndex != -1 && endIndex > startIndex;
}

//....
else if( EndsWith({"d","dsh"}) && validate(m_input_line) ){ ...}

接頭辞「m_」に気付いたので、これはあるクラスの一部だと思います。したがって、必要に応じてプライベートヘルパー関数を作成して、コードをよりクリーンで理解しやすくします。

于 2012-11-08T16:09:17.743 に答える
0

それは真実ではない。そこで変数を初期化すると、変数を のスコープに宣言できifます。

if ( int i = 0 )
{
    i = 1;
}
else
{
    i = 2;
}

これは単純な例ですが、合法です。

于 2012-11-08T16:04:12.440 に答える
0

アンワインドの答えに似ています:if/then/elseの本体にインライン関数を使用するのはどうですか?

ただし、どちらの場合も、かなりの値を渡す必要があると思います。

于 2012-11-08T16:04:22.780 に答える