这是 C++11 中的一种方法,使用std::initializer_list
:
#include <algorithm>
#include <initializer_list>
template <typename T>
bool is_in(const T& v, std::initializer_list<T> lst)
{
return std::find(std::begin(lst), std::end(lst), v) != std::end(lst);
}
这样,您可以执行以下操作:
if (is_in(num, {1, 2, 3})) { DO STUFF }
但当不与内置类型一起使用时,它的效率不是很高。int
会工作得很好,但如果你比较std::string
例如,变量,生成的代码非常糟糕。
然而,在 C++17 中,您可以使用更有效的解决方案,该解决方案适用于任何类型:
template<typename First, typename ... T>
bool is_in(First &&first, T && ... t)
{
return ((first == t) || ...);
}
// ...
// s1, s2, s3, s4 are strings.
if (is_in(s1, s2, s3, s4)) // ...
C++11 版本在这里效率非常低,而该版本应该生成与手写比较相同的代码。