【发布时间】:2011-03-25 15:41:04
【问题描述】:
我正在尝试编写一个四叉树稀疏矩阵类。简而言之,quadtree_matrix<T> 要么是零矩阵,要么是 quadtree_matrix<T> 的四倍 (ne, nw, se, sw)。
我想最终测试不同的分配方案,因为这可能会影响线性代数运算的性能。所以我还将在标准分配器类型上模板quadtree_matrix,以便我可以重用现有的分配器。
我将不得不分配两种不同类型的数据:T 或 node,其中包含四个指针(指向 T 或节点)。对于我将考虑的所有算法,我确切地知道期望什么样的数据,因为我知道在算法的任何时候我所面临的子矩阵的大小是多少(我什至不需要存储这些大小)。
我当然会使用两个不同的分配器:这没关系,因为分配器类型提供了 rebind 模板和模板复制构造函数(并且旨在用作值类型,作为标准的 get_allocator 成员容器通过返回副本来建议)。
问题是分配器成员函数使用某种pointer 类型,它不需要是普通指针。一些分配器(增强进程间分配器)广泛使用此功能。
如果分配器指针类型是花园类型的指针,我不会有任何问题:至少,我可以使用指针来 void 并将它们重新解释为正确的类型(node* 或 T*)。我也可以使用联合(可能更好)。
据我所知,allocator::pointer 类型的 PODness 没有要求。它们只需要是随机访问迭代器。
现在,我的问题是:
给定一个分配器类模板A<T>(或等效的A::rebind<T>::other),是否有任何保证:
- 将
A<T>::pointer静态转换为A<U>::pointer的能力提供U是T的可访问基础? - 将
A<T>::pointer静态转换为A<U>::pointer的能力提供T是U的可访问基础,并且被种姓的“运行时类型”(无论在此上下文中是什么意思)是@987654343 @ ? A<void>::pointer类型(如果有意义的话)?
或者有没有我没有想到的问题的解决方案?
【问题讨论】:
标签: c++ standard-library allocator language-lawyer