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 >