On Mon, Jan 25, 2010 at 1:24 PM, Piotr Wyderski
<piotr.wyder...@gmail.com> wrote:
> I have a hash function hash(T v) overloaded for
> all integral types. I want to provide a variant for
> float and double, which should work as follows:
> take the floating-point value, treat its binary
> representation as uint32_t/uint64_t and use
> the result as a parameter for an integral hash().
>
> However, GCC warns me about strict aliasing
> rules violation, which is technically correct, but
> in this case is intended. How do I perform this
> conversion ina GCC-friendly way? Even that
> produces a warning:
>
>    inline hash_type hash(float v) {
>
>        return hash(*reinterpret_cast<const
> std::uint32_t*>(reinterpret_cast<const char*>(&v)));
>    }
>
> but I expected char* to be allowed to alias anything.

But your access is via std::uint32_t *, not char.  Use a
union like

  union { float f; uint32 i; } u = {.f = v};
  return u.i;

Richard.

> Best regards
> Piotr Wyderski
>

Reply via email to