Search code examples
c++c++11boostinitializer-list

Check whether an element is in std::initializer_list


I want to be able to write in C++ something similar to the following Python code:

if x in [1, 2, 3, 5] ...

to test whether an element is contained in a set of hard-coded values, defined in-place. Like this:

if (in(x, {1, 2, 3, 5})) ...

Here is the possible implementation of the in function:

template<class T>
bool in(const T& x, std::initializer_list<T> c)
{
  return std::find(c.begin(), c.end(), x) != c.end();
}

My question is: do I really have to write this function by myself? Are there any default implementations over there? Maybe in boost? I checked boost::contains, but it works only with strings.


Solution

  • If you have access to you can use set's contains which returns a bool allowing you to do:

    if(set{ 4, 8, 15, 16, 23, 42 }.contains(x))
    

    Live Example


    Otherwise, with just you can still use set's count which only returns 1 or 0 allowing you to do something like:

    if(set<int>{ 4, 8, 15, 16, 23, 42 }.count(x) > 0U)
    

    Live Example


    Keep in mind that magic numbers can be confusing for your audience (and cause 5 seasons of Lost.)
    I'd recommend declaring your numbers as a const initializer_list<int> and giving them a meaningful name:

    const auto finalCandidates{ 4, 8, 15, 16, 23, 42 };
    
    if(cend(finalCandidates) != find(cbegin(finalCandidates), cend(finalCandidates), x))