On Thu, May 21, 2015 at 2:21 AM, <dariomt@gmail.com> wrote:
Hi list,

I usually find useful an overload of this function to check whether all elements in a range are equal *to each other*.

Something like:

template <typename Range> 
bool all_of_equal(const Range & r)
{
    // return true on empty range
    if (boost::empty(r)) return true;
    // return true if all other elements are equal to the first element
    return boost::all_of_equal( boost::next( boost::begin(r) ), boost::end(r), *boost::begin(r));
}

Would this be a useful addition to Boost.Algorithm?


I'm not enthusiastic about this. Then again, I am not enthusiastic about all_of, etc in general.  I think they're barely convenience functions, they throw away information (returning a boolean, rather than the position where the comparison failed), and they can be easily implemented using std::find.

As to your particular proposal, what would you do for a predicate version? (i.e, not using operator== to compare the elements). The signature "all_of_equal(const Range &r, const T &val)" is already taken, so we can't declare "all_of_equal(const Range &r, Predicate p)".

I think that this is a good example of something that you should keep in your codebase, rather than in Boost. 

If you disagree, please let me know.

-- Marshall