Re: Cast pointer to data member to integer type - legit?
In article <e3v9a5$c2$1@s1.news.oleane.net>,
Falk Tannh?user <clcppm-poster@this.is.invalid> wrote:
However, if you really need to convert member pointers to offsets,
you can try the following function, for which one can imagine 2
different ways to implement it (I put them in a conditional
compilation directive):
template<typename ClassT, typename MemberT> inline
std::ptrdiff_t offset_off(MemberT ClassT::*memptr)
{
#if 0 // *** [1] ***
ClassT* pc = 0;
return reinterpret_cast<char*>(&(pc->*memptr)) -
reinterpret_cast<char*>(pc);
#else // *** [2] ***
ClassT c;
return reinterpret_cast<char*>(&(c.*memptr)) -
reinterpret_cast<char*>(&c);
#endif
}
Keep in mind that the way [1] relies on Undefined Behaviour,
thus it may work on some implementations and break on others
- especially in presence of multiple or virtual inheritance.
Way [2], while not suffering from this problem, has the
disadvantage of instantiating the class in question -
in particular it requires the presence of an accessible
default constructor.
Thanks. I'll keep this in mind, though it's certainly not optimal and
maybe a bit too risky.
So there is no 100% satisfying solution to your problem,
short of proposing an appropriate new feature to the Standard...
Oh well. Guess I'll either just stick with C for this part or change
the API.
I think the matter is closed now. I see what I was doing was
implementation specific and not defined by the language, and unless I'm
dealing with PODs, getting byte offsets isn't quite trivial.
Thanks to all for the assistance - the archives for this group have been
very helpful on multiple occasions.
Scott
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]