
Zach Laine wrote:
Naively, I would have reduced them to:
struct unordered_tag {};
template<class Hash, class Flavor, class T> constexpr void hash_append( Hash& h, Flavor const& f, T const& v );
template<class Hash, class Flavor, class It> constexpr void hash_append( Hash& h, Flavor const& f, It first, It last );
template<class Hash, class Flavor, class It> constexpr void hash_append( Hash& h, Flavor const& f, It first, It last, unordered_tag );
Is there a reason that could not work?
There is, yes. Naming everything hash_append doesn't play well with making hash_append variadic, as has already been suggested a few times. Once you have that, the above overload set becomes a nice trap because hash_append( h, f, "foo", "bar" ); calls the iterator overload.