我正在尝试编写一个四叉树稀疏矩阵类。简而言之,quadtree_matrix<T>
是零矩阵或(ne, nw, se, sw)
的四倍quadtree_matrix<T>
。
我最终要测试不同的分配方案,因为这可能会影响线性代数运算的性能。所以我还将在标准分配器类型上模板quadtree_matrix
,以便我可以重用现有的分配器。
我将不得不分配两种不同类型的数据:T
或node
,其中包含四个指针(指向T或节点)。对于我将考虑的所有算法,我知道可以期待什么样的数据,因为我知道在算法的任何一点上我面临的子矩阵的大小(我甚至不需要存储这些大小)。
我当然会使用两个不同的分配器:这是可以的,因为分配器类型提供rebind
模板和模板复制构造函数(并且旨在用作值类型,如{{1}标准容器的成员建议通过返回副本)。
问题是分配器成员函数使用某种get_allocator
类型,它不需要是一个vanilla指针。一些分配器(boost进程间分配器)广泛使用此功能。
如果分配器指针类型是花园种类指针,我就没有问题:至少,我可以使用指针void并将它们重新解释为正确的类型(pointer
或node*
)。我也可以使用联盟(可能更好)。
据我所知,T*
类型的POD没有要求。它们只需要是随机访问迭代器。
现在,我的问题是:
鉴于分配器类模板allocator::pointer
(或其等效的A<T>
),是否有任何保证:
A::rebind<T>::other
提供A<T>::pointer
静态广告A<U>::pointer
的能力是U
的可访问基础? T
静态转换为A<T>::pointer
提供A<U>::pointer
的能力是T
和“运行时类型”的可访问基础(无论这意味着什么) castee的上下文是U
? U
(如果这样做有意义)? 或者我的问题是否有解决方案我没想过?
答案 0 :(得分:2)
从20.1.5 / 2中的表中可以清楚地看出A<T>::pointer
的类型必须是“指向T
的指针”。由于这些指针类型通常是可转换的,因此1和2都是正确的。接下来A<void>::pointer
必须是void*
。
编辑: 在20.1.5 / 4中也有明确的措辞(它适用于标准容器可能假设的分配器):
typedef成员指针, const_pointer,size_type和 difference_type必须是 T *,T const *,size_t和ptrdiff_t, 分别
答案 1 :(得分:0)
不,不是真的。
要求A&lt; T&gt; ::指针可转换为A&lt; T&gt; :: const_pointer和A&lt; T&gt; :: void_pointer,但这是我能找到的所有内容。
&lt; void&gt; ::指针很可能是void*
,除非你有一些奇特的特殊记忆。
答案 2 :(得分:0)
请注意,即使union
可用,我仍然不会使用,特别是因为在这里您可能会受益于某种形式的自动内存管理(为了让您的包含不泄漏),这需要花哨的课程。
因此,我建议采用两步法:
delete
)boost::variant
通过这种方式,您可以同时拥有自动内存管理和兼容性。