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 - 但它们可能需要从输入流中提取的整数值,或双精度值,或两个点,或其他。 ...

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

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


(1) 正如一些人指出的那样,可以声明一个基本类型的变量,如果它是第一个变量,并且只针对非零进行测试。这太有限了,不能作为这个问题的一般解决方案有很大用处(尽管偶尔会出现有用的地方 - 但确实很少见)。

4

5 回答 5

3

一种解决方案是让每个案例成为一个不同的函数,无论它是否成功都会返回。

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

于 2012-11-08T16:00:30.650 回答
2

允许在ifandwhile语句中定义局部变量;但是,每个语句只能声明一个,并且只能测试非零值:

...
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

这不是真的。if如果你在那里初始化它,你可以将一个变量声明到它的范围内。

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

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

于 2012-11-08T16:04:12.440 回答
0

与 unwind 的回答类似:对 if/then/else 的主体使用内联函数怎么样?

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

于 2012-11-08T16:04:22.780 回答
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 回答