将许多 int 变量与值进行比较的优雅方法 - C++

Hus*_*kfa 0 c++ integer if-statement compare

在当前的两个答案中,我选择了使用基于范围的 for 循环的答案,因为它更好地满足了我的第一个要求,即避免冗长。可变参数模板的答案很有趣(我会尝试一下!),但比我想要的要长(因为我希望所有事情都在我提到的变量相同的函数内完成)。

如果其他人提出另一种方法,我仍然会关注(即使在遥远的将来!)并且总是很乐意选择可能更好的解决方案;)


我正在使用 Visual Studio 2017 Professional、C++、MFC


我有一个奇怪的问题,可能没有解决方案

我有一个遇到多个int变量的函数,假设我总共有六个变量:int1, int2, ..., int6。

我想将这些值中的每一个与 进行比较-1。如果其中任何一个== -1,则该void函数return提前退出。

我知道您可能想到的第一个想法是一个冗长的if声明,可能有几个分支,例如:

if ( (int1 == -1) || (int2 == -1) || ... || (int6 == -1) ) { return;}

或者

if (int1 == -1) { return;}
else if (int2 == -1) { return;}
...
else if (int6 == -1) { return;}
Run Code Online (Sandbox Code Playgroud)

另一个想法是将所有这些ints 推入 astd::vector<int>然后迭代它们,将每个元素与-1子句进行比较if,return如果存在匹配则进行 ing。如果没有其他解决方案,我将采用这个计划。

有没有一种方法可以用更优雅的方法来检查这些值:

  1. 不长
  2. 不使用诸如std::vector
  3. 不使用比上面两个想法更多的内存

再说一次,我完全理解是否没有适合我的规范的方法,在这种情况下我会采用该方法std::vector。我确实知道在某些时候我必须硬着头皮去比较 sint但我很感兴趣是否还有其他方法!

感谢您的帮助,提前谢谢您!:D

Kam*_*Cuk 6

您可以使用带有折叠表达式的可变参数模板。

template<typename ...T>
bool any_equal_to_minus_1(T... t) {
    return (... || (t == -1));
}

...
    if (any_equal_to_minus_1(int1, int2, etc)) return;
Run Code Online (Sandbox Code Playgroud)

然后,您可以将函数包装在调用端,从而节省变量的输入:

void your_function_real_part(int arg1, int arg2, int arg3);
    
template<typename ...T>
void your_function(T... t) {
    if (any_equal_to_minus_1(t...)) return;
    your_function_real_part(t...);
}

int main() {
    your_function(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)