template<typename Unsigned>
auto operator+(gray_code<Unsigned> lhs, gray_code<Unsigned> rhs)
-> gray_code<Unsigned>
{
Unsigned lhs_p = is_odd(lhs);
Unsigned rhs_p = is_odd(rhs);
gray_code<Unsigned> res{};
const Unsigned n = std::numeric_limits<Unsigned>::digits;
for (Unsigned i = 0u ; i < n ; ++i)
{
auto lhs_i = (lhs.value & (1u << i)) >> i;
auto rhs_i = (rhs.value & (1u << i)) >> i;
auto e = lhs_p;