を使用した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 バージョンはここでは非常に非効率的ですが、このバージョンは手書きの比較と同じコードを生成するはずです。