"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?