Yet another hash tuple in C++17
Your code doesn't handle empty tuples gracefully.  The first version generates a compilation error, and the second version returns void.  For the first version, you can add an apply_tuple overload for empty tuples.  For the second version, you can change

return ((seed = hash_combine(std::get&lt;I&gt;(t), seed)), ...);


to

((seed = hash_combine(std::get&lt;I&gt;(t), seed)), ...);
return seed;




Is 0 really a good initial seed?  Some prime number, I guess, might be better (e.g., 672807365, which is what MSVC returns for std::hash&lt;std::nullptr_t&gt;{}(nullptr)).



The tuple unpacking can be simplified with std::apply, avoiding index_sequences:

template &lt;typename... Args&gt;
struct hash&lt;std::tuple&lt;Args...&gt;&gt; {
    std::size_t operator()(const std::tuple&lt;Args...&gt;&amp; tuple) const noexcept
    {
        return std::apply([](const auto&amp;... args) {
            auto seed = static_cast&lt;std::size_t&gt;(672807365);
            ((seed = hash_combine(args, seed)), ...);
            return seed;
        }, tuple);
    }
};


(live demo)