C++ 指针重新绑定的目的是什么?

C++ 指针重新绑定的目的是什么?,c++,pointers,traits,C++,Pointers,Traits,我正在尝试实现std::list(MSVC)。有一件事我不能理解: template <class _Value_type, class _Voidptr> // voidptr? For what? struct _List_node { // list node using value_type = _Value_type; using _Nodeptr = _Rebind_pointer_t<_Voidptr, _List_node>; // w

我正在尝试实现
std::list
(MSVC)。有一件事我不能理解:

template <class _Value_type, class _Voidptr> // voidptr? For what?
struct _List_node { // list node
    using value_type = _Value_type;
    using _Nodeptr   = _Rebind_pointer_t<_Voidptr, _List_node>; // what is the purpose of such rebind?
    ...
}
template//voidptr?为了什么?
结构_列表_节点{//列表节点
使用值类型=\u值类型;
使用_Nodeptr=\u Rebind\u pointer\u t;//这种重新绑定的目的是什么?
...
}
我理解分配器重新绑定的原因,但是指针?我为什么要用它,在哪里


UPD:我明白,重新绑定是什么。我的意思是,为什么不干脆
\u Nodeptr*
?为什么我需要重新绑定?(感谢Evg)

用户使用
值类型实例化列表。
例如,对于
list
value\u type
将是
int
。 此外,列表分配器(也可以提供)为
value\u类型的对象分配内存

但是
值\u类型
不是列表内部包含的内容。 该列表在内部保存值类型为其成员的
**节点**

因此,为了能够将分配和指针从
值类型
转换为
节点
(至少保存值类型和指向下一个节点的指针),需要使用重新绑定

相反,这将不需要一个
向量

这是因为向量的内部表示形式将在内部正常地保存指向value_type对象数组的指针,在本例中为int。所以这里不需要重新绑定。

这个问题的答案也来自分配器。让我们来看看<代码>如何? 有效地,我们将分配器的
void\u指针
重新绑定到
\u List\u节点
指针。为了支持在内部使用奇特指针的分配器,需要使用这个技巧


在Boost.Interprocess库中可以找到这样一个例子。它有:

使用段管理器作为内存源的STL兼容分配器。内部指针类型将与
typename SegmentManager::void\u指针类型相同(原始、智能)。这允许将分配器放置在共享内存、内存映射文件等中

例如,我们可以写作

namespace bi = boost::interprocess;
using Allocator = bi::allocator<int, bi::managed_shared_memory::segment_manager>;
std::list<int, Allocator> list(/* allocator object */);
namespace bi=boost::进程间;
使用分配器=bi::分配器;
std::list list(/*分配器对象*/);

现在,
std::allocator\u traits::void\u指针
将不再是默认分配器的
void*
,而是
boost::进程间::偏移量\u ptr
。因此,
\u Nodeptr
将不是
\u Nodeptr*
,而是
boost::interprocess::offset\u ptr

相关:真正的问题是:为什么不干脆
\u Nodeptr*
?你为什么需要重新绑定?是的,我需要指定question@Evg:因为没有人说指针到底是什么。它可以只是节点,但理论上也可以是某种奇特的指针。所以基本上:我希望节点是与value_type相同的poitner类型,不管它是什么类型的指针。@StPiere,现在我明白了这个想法。请你写一个例子好吗?(link或smth))@Shamil:你已经自己写了这个例子了。只要看看list stl:msvc、libstdc++等的一些实现,就可以在谷歌上搜索到一种奇特的指针,例如:boost::interprocess::offset\ptr谢谢。帮助您理解前面的答案)
template <class _Value_type, class _Voidptr>
struct _List_node {
    using _Nodeptr = typename pointer_traits<_Voidptr>::template rebind<_List_node>;
    // ...
}
using _Node = _List_node<_Ty, typename _Alty_traits::void_pointer>;
namespace bi = boost::interprocess;
using Allocator = bi::allocator<int, bi::managed_shared_memory::segment_manager>;
std::list<int, Allocator> list(/* allocator object */);