Getting object from pointer to data member

S

Salvo Isaja

Greetings,
this is my first post here, please be forgiving ;)

I'm developing an embedded operating system in C++, and I'm writing my
own small library for intrusive data structures. I'd like to use a
hook member to store bookkeeping, inspired from Boost.Intrusive:
http://www.boost.org/doc/libs/1_35_0/doc/html/intrusive/usage.html#intrusive.usage.usage_member_hook

When the data structure user instantiates the class template, it
specifies the node type and the address of the hook member, such as:

class MyDataStructureHook
{
private:
// pointers to other MyDataStructureHook's
};

template <typename T, MyDataStructureHook T::* H>
class MyDataStructure
{
public:
// ctors, dtors and other members
void push(T& x);
void pop();
T& top() const;
private:
MyDataStructureHook* top_;
};

struct MyNode
{
int somePayload_;
MyDataStructureHook hook_;
bool operator<(const MyNode& x);
};

MyDataStructure<MyNode, &MyNode::hook_> myDataStructure;


I know I can easily get a pointer to the hook member given a MyNode
object, for example in push(), using MyDataStructureHook* h = &(x.*H);

I wonder how I can do the opposite, for example in top(), to return a
T& from MyDataStructureHook* top_. I see the Boost.Intrusive
implementation is compiler-dependent, and it uses casts to char (boost/
intrusive/detail/parent_from_member.hpp), and I know I could get away
putting a T& owner_ in MyDataStructureHook. I wonder if there is a
reliable, simple and portable way to do that without adding further
bookkeeping.

For the record, I'm using GCC 4.3 on Debian Testing on x86, and as I
first try I was tempted to mess with addresses (sizeof(MyNode::*) == 4
and &MyNode.hook_ == 4 here).

Thank you,
Salvo
--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,074
Latest member
StanleyFra

Latest Threads

Top