8

我正在尝试编写一个四叉树稀疏矩阵类。简而言之,aquadtree_matrix<T>要么是零矩阵,要么是 的四元(ne, nw, se, sw)quadtree_matrix<T>

我想最终测试不同的分配方案,因为这可能会影响线性代数运算的性能。因此,我还将quadtree_matrix在标准分配器类型上进行模板化,以便我可以重用现有的分配器。

我将不得不分配两种不同类型的数据: aT或 a node,其中包含四个指针(指向 T 或节点)。对于我将考虑的所有算法,我确切地知道期望什么样的数据,因为我知道在算法的任何时候我所面临的子矩阵的大小是多少(我什至不需要存储这些大小)。

我当然会使用两种不同的分配器:这没关系,因为分配器类型提供rebind模板和模板复制构造函数(并且旨在用作值类型,正如get_allocator标准容器的成员通过返回副本所建议的那样)。

问题是分配器成员函数使用某种pointer类型,它不需要是普通指针。一些分配器(增强进程间分配器)广泛使用此功能。

如果分配器指针类型是花园品种指针,我不会有任何问题:至少,我可以使用指向 void 的指针并将它们重新解释为正确的类型(node*T*)。我也可以使用联合(可能更好)。

据我所知,对类型的 POD 没有要求allocator::pointer。它们只需要是随机访问迭代器。

现在,我的问题是:

给定一个分配器类模板A<T>(或其等价物A::rebind<T>::other),是否有任何保证:

  1. 提供的静态转换能力A<T>::pointer是一个可访问的基础?A<U>::pointerUT
  2. 提供静态强制转换的能力A<T>::pointer是可访问的基础,并且被继承人的“运行时类型”(无论这在此上下文中意味着什么)是?A<U>::pointerTUU
  3. 类型A<void>::pointer(如果这有意义的话)?

或者有没有我没有想到的问题的解决方案?

4

3 回答 3

2

从 20.1.5/2 中的表格可以清楚地看出,类型A<T>::pointer必须是“指向的指针T”。由于这些指针类型通常是可转换的,因此您的 1 和 2 是正确的。那么它A<void>::pointer必须是void*

编辑:20.1.5/4 中也有明确的措辞(它适用于标准容器对分配器的假设):

typedef 成员 pointer、const_pointer、size_type 和 difference_type 要求分别为 T*、T const*、size_t 和 ptrdiff_t。

于 2011-03-25T16:14:26.660 回答
0

不,不是。

要求 A<T>::pointer 可以转换为 A<T>::const_pointer 和 A<T>::void_pointer ,但这就是我能找到的所有内容。

A<void>::pointer 可能是void*,除非您有一些花哨的特殊内存。

于 2011-03-25T16:06:41.560 回答
0

请注意,即使 aunion可用,我仍然不会使用它,特别是因为在这里您可能会受益于某种形式的自动内存管理(为了使您的包含不泄漏),这需要花哨的类。

因此,我建议采用两步法:

  • 编写一个小的智能指针,使用给定的分配器来执行销毁(而不是delete
  • boost::variant在你的指针上

这样你就有了自动内存管理紧凑性

于 2011-03-25T16:31:33.710 回答