Being stuck with C++ I did something in reverse - ported C-style ("intrusive") containers to ++, making them a bit safer to use, but keeping the syntax nearly the same.
https://github.com/apankrat/notes/tree/master/intrusive-cont...
Being stuck with C++ I did something in reverse - ported C-style ("intrusive") containers to ++, making them a bit safer to use, but keeping the syntax nearly the same.
https://github.com/apankrat/notes/tree/master/intrusive-cont...
https://www.boost.org/doc/libs/1_75_0/doc/html/intrusive.htm...
Have you considered it? Is it deficient for your use case?
"the goal here is to make a better version of C-style containers rather than to implement something C++-style and similar,"?
But a goal is not a reason. I.e. why doing
CONTAINER_OF( user_data, vip );
instead of container_of<&user_data::vip> vip_list;
is preferable? How are they even meaningfully different?As to why to do what you wrote I have no idea. These two code snippets are unrelated.
If I were to pick the reason, it'd be simply that I don't like Boost.
To me, Boost is an ultimate embodiment of all that went wrong with C++ when it evolved from being a better version of C into the multi-paradigm monstrosity that it is now. Just look at the man page linked above. How to get a clever little concept of intrusive containers and completely decimate it into a technically correct, but unpalatable formulistic piece of engineering that, above all else, is rid of any shred of elegance that made the original concept so great in the first place.
It will also take up more space, to store that very pointer.
All of which starts to matter (a lot) when operating with very large data sets.
Among other implications (different memory locality and allocation guarantees), you could have the same intrusive node object used in several container objects or even classes (though not at the same time). That is, pull an element from a doubly linked list and insert it into a binary tree without reallocation.
With std::list you need to find the iterate to the node before you can delete it.