get Class from Pointer of member
Ali Çehreli
acehreli at yahoo.com
Thu May 24 09:41:17 PDT 2012
On 05/24/2012 05:29 AM, StefanvT wrote:
> I have such a function in C++:
>
> template<class CB,class FIELD>
> inline CB* get_class_from_field( FIELD CB::*field, FIELD* mp) {
> return reinterpret_cast<CB*>(
> reinterpret_cast<char*>(mp) -
> reinterpret_cast<ptrdiff_t>(&(reinterpret_cast<CB*>(0)->*field)));
> }
I think get_object_from_field() would be a better name.
> Here I come with a pointer to a class member and can calculate the
> pointer to the class, where the member is within. (Nothing spectacular
> in c++)
>
> Is this also possible in D?
There are no pointers to members in D. In C++, member pointers carry the
offset of the field. The same can be achieved by using the .offsetof
property:
class C
{
int i;
int j;
}
CB get_object_from_field(CB, FIELD)(size_t offset, FIELD * f)
{
return cast(CB)(cast(ubyte*)f - offset);
}
void main()
{
auto c = new C;
C c2 = get_object_from_field!C(c.j.offsetof, &c.j);
assert(c2 is c);
}
I am pretty sure there are better solutions for a more specific problem.
Ali
--
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
More information about the Digitalmars-d-learn
mailing list