Allows to take full advantage of compile-time information.
Examples:
enum class x { A, B, C };
using my_enum = super_enum<x, x::A, x::B, x::C>;
using my_enumset = enum_set<my_enum>;
static_assert(my_enumset::frozen<x::A, x::B>::contains<x::A>(),
"it should...");
assert(my_enumset::frozen<x::A, x::B>::contains(x::A));