如何改进if / else局部变量的处理?

时间:2012-11-08 15:55:45

标签: c++

我通常有代码,我想检测某些条件,如果存在,则处理该条件。

条件测试提取对处理问题的一半重要的某些信息。

但是,如果/ else构造无法允许在if结构本身(1)中声明local-to-the-if​​变量。因此,我必须在整个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或两个点,或者其他......

关键是,我不知道将const TCHAR * p1和p2本地引入上述范围,它是唯一使用的地方,它仍然允许整体结构保持不变。

是否有一些C ++语言功能或可能允许的模式?


(1)正如一些人所指出的那样,如果它是第一件事,就可以声明一个基本类型的单个变量,并且仅针对非零来测试它。这个问题太过局限,不能作为这个问题的一般解决方案(虽然偶尔会出现有用的时刻 - 但真的很少见。)

5 个答案:

答案 0 :(得分:3)

一种解决方案是使每个案例成为一个独特的函数,返回它是否成功。

这为变量提供了一个自然的良好本地化范围,并且希望(假设)合理的编译器可以内联它们。

答案 1 :(得分:2)

您可以在ifwhile语句中定义局部变量;但是,每个语句只能声明一个,并且只能测试非零的值:

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

在这种情况下,您也可以在TCHAR *p1, *p2; / if语句链之前声明else,我不会发现任何问题。

答案 2 :(得分:0)

那不是真的。如果在那里初始化变量,可以将变量声明为if的范围。

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

这是一个愚蠢的例子,但它是合法的。

答案 3 :(得分:0)

与unwind的答案类似:如何为if / then / else的主体使用内联函数?

但是,我想在这两种情况下你可能需要传递相当多的值。

答案 4 :(得分: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_”所以我猜这是某个类的一部分。因此,必要时使私有辅助函数变得更清晰,更容易理解。