Alf P. Steinbach wrote:
* Maxim Yegorushkin:
On Apr 15, 12:58 pm, "Alf P. Steinbach" <al...@start.no> wrote:
* James Kanze:
On Apr 15, 4:04 am, "Alf P. Steinbach" <al...@start.no> wrote:
* Jonathan Lee:
But better, don't use void* pointers (except for the special
case of identifying objects in e.g. a hash table, in which
case you should make sure to have pointers to complete
objects, e.g. obtained by dynamic_cast to void*).
I'm not sure I understand this one. Do you mean just using the
pointer as the key?
Yes.
(And how do you get a hash value for a pointer, portably?)
Wait a sec, checking Boost...
KO.
// Implementation by Alberto Barbati and Dave Harris.
#if !BOOST_WORKAROUND(__DMC__, <= 0x848)
template <class T> std::size_t hash_value(T* const& v)
#else
template <class T> std::size_t hash_value(T* v)
#endif
{
std::size_t x = static_cast<std::size_t>(
reinterpret_cast<std::ptrdiff_t>(v));
return x + (x >> 3);
}
Wow! Why can't it be as simple as:
std::size_t x = v - static_cast<T*>(0);
?
Because the subtraction is only formally defined when the '-' operands
are both pointers within the same array (including hypothetical
after-end element) or, uh, I'm too lazy to look it up, but roughly,
point to the same object or within the same POD object.
The standard library's comparision functors do magic that implies that
they're somehow accessing a linear ordering of pointer values, but AFAIK
that is not exposed for use by ordinary programmers, so one is reduced
to casting.
On the other hand, I don't know why the Boost developers add x/8.