我通常有代码,我想检测某些条件,如果存在,则处理该条件。
条件测试提取对处理问题的一半重要的某些信息。
但是,如果/ 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)正如一些人所指出的那样,如果它是第一件事,就可以声明一个基本类型的单个变量,并且仅针对非零来测试它。这个问题太过局限,不能作为这个问题的一般解决方案(虽然偶尔会出现有用的时刻 - 但真的很少见。)
答案 0 :(得分:3)
一种解决方案是使每个案例成为一个独特的函数,返回它是否成功。
这为变量提供了一个自然的良好本地化范围,并且希望(假设)合理的编译器可以内联它们。
答案 1 :(得分:2)
您可以在if
和while
语句中定义局部变量;但是,每个语句只能声明一个,并且只能测试非零的值:
...
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_”所以我猜这是某个类的一部分。因此,必要时使私有辅助函数变得更清晰,更容易理解。