namespace jegp { // [utility.underlying], underlying template <class Enum> constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept; // [static.downcast], static_downcast template <class DerivedRef, class Base> constexpr DerivedRef static_downcast(Base&& base) noexcept; // [hash.combine], hash_combine template <class... Args> constexpr std::size_t hash_combine(const Args&... args) noexcept(see below); } // namespace jegp
template <class Enum>
constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept;
template <class DerivedRef, class Base>
constexpr DerivedRef static_downcast(Base&& base) noexcept;
template <class... Args>
constexpr std::size_t hash_combine(const Args&... args) noexcept(see below);
std::size_t seed{0}; return (..., (seed ^= std::hash<Args>{}(args) + (seed << 6) + (seed >> 2)));