优化条件

Uno*_*aso 3 c++ if-statement

我有一个关于ifforwhile循环中的条件的简单问题。有什么方法可以让我用更少的代码行验证这个条件吗?

if (are_you_sure != "Si" && are_you_sure != "si" && are_you_sure != "No" && are_you_sure != "no")
Run Code Online (Sandbox Code Playgroud)

我不认为我可以最小化上面的代码,但我想确定。

cig*_*ien 7

如果您有一个为您执行此操作的函数,则您可以编写更少的代码并使其更具可读性:

if (none_of( are_you_sure, "Si", "si", "No", "no"))
  // ...
Run Code Online (Sandbox Code Playgroud)

当然,那个函数是要写的,不过用c++17折叠表达式写的代码不算多:

template<typename T, typename ...Opts>
auto none_of(T val, Opts ...opts)
{
    return (... && (val != opts));
}  
Run Code Online (Sandbox Code Playgroud)

这有一些不错的特性;它可以接受任意数量的参数,也可以与字符串以外的类型一起使用:

int n = 42;
if (none_of( n, 1, 2, 3))
  // ...
Run Code Online (Sandbox Code Playgroud)

确保为函数命名,因为这会极大地影响可读性。