Ale*_* C. 8 c++ standard-library allocator language-lawyer
我正在尝试编写一个四叉树稀疏矩阵类.简而言之,quadtree_matrix<T>或者是零矩阵或者四元(ne, nw, se, sw)的quadtree_matrix<T>.
我想最终测试不同的分配方案,因为这可能会影响线性代数运算的性能.所以我还将模板化quadtree_matrix标准分配器类型,以便我可以重用现有的分配器.
我将不得不分配两种不同类型的数据:a T或a node,包含四个指针(T或节点).对于我将考虑的所有算法,我知道可以期待什么样的数据,因为我知道在算法的任何一点上我面临的子矩阵的大小(我甚至不需要存储这些大小).
我当然会使用两个不同的分配器:这是可以的,因为分配器类型提供rebind模板和模板复制构造函数(并且旨在用作值类型,因为get_allocator标准容器的成员通过返回副本来建议).
问题是分配器成员函数使用某种pointer类型,这不需要是一个vanilla指针.一些分配器(boost进程间分配器)广泛使用此功能.
如果分配器指针类型是花园种类指针,我将没有问题:至少,我可以使用指针void并将它们重新解释为正确的类型(node*或者T*).我也可以使用联盟(可能更好).
据我所知,对allocator::pointer类型的POD没有要求.它们只需要是随机访问迭代器.
现在,我的问题是:
给定一个allocator类模板A<T>(或其等价物A::rebind<T>::other),是否有任何保证:
A<T>::pointer转换的能力是一个可访问的基础?A<U>::pointerUTA<T>::pointer,以A<U>::pointer提供T为的可接近碱U和"运行时类型"(无论这意味着在这种情况下)的castee是U?A<void>::pointer(如果这是有道理的)?或者我的问题是否有解决方案?
从 20.1.5/2 的表中可以清楚地看出 的类型A<T>::pointer必须是“pointer to 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。
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |