Я пытаюсь написать класс разреженных матриц дерева.Короче говоря, quadtree_matrix<T>
- это либо нулевая матрица, либо четверка (ne, nw, se, sw)
из quadtree_matrix<T>
.
. Мне бы хотелось в конечном итоге протестировать различные схемы распределения, поскольку это, вероятно, повлияет на производительность операций линейной алгебры.,Поэтому я также создам шаблон quadtree_matrix
для стандартного типа распределителя, чтобы я мог повторно использовать существующие распределители.
Мне нужно будет выделить два разных типа данных: либо T
, либо node
, который содержит четыре указателя (либо на T, либо на узел).Для всех алгоритмов, которые я рассмотрю, я точно знаю, какие данные ожидать, потому что я знаю, каковы размеры подматриц, с которыми я сталкиваюсь в любой точке алгоритма (мне даже не нужно хранить эти размеры).
Я, конечно, буду использовать два разных распределителя: это нормально, поскольку типы распределителя предоставляют шаблон rebind
и конструктор копирования шаблона (и предназначены для использования в качестве типов значений, как get_allocator
члены стандартных контейнеров предлагают, возвращая копию).
Проблема в том, что функции-члены распределителя используют определенный тип pointer
, который не обязательно должен быть указателем ванили.Некоторые распределители (повышающие межпроцессные распределители) широко используют эту функцию.
Если бы указатели типа распределителя были указателями разновидностей сада, у меня не было бы никаких проблем: по крайней мере, я мог бы использовать указатели, чтобы аннулировать и повторно интерпретировать их в нужный тип (либо node*
, либо T*
),Я мог бы также использовать объединение (возможно, лучше).
Насколько я знаю, нет требования к PODness типов allocator::pointer
.Они должны быть только итераторами с произвольным доступом.
Теперь мой вопрос:
Учитывая шаблон класса распределителя A<T>
(или его эквивалент A::rebind<T>::other
), есть лилюбая гарантия на:
- Способность к статическому приведению
A<T>::pointer
к A<U>::pointer
при условии U
является доступной базой T
? - Способность к статическому приведению
A<T>::pointer
к A<U>::pointer
при условии T
является доступной базой U
, а "тип времени выполнения" (что бы это ни значило в данном контексте) заинтересованного лица - U
? - Тип
A<void>::pointer
(если это имеет смысл)?
Или есть решение моей проблемы?думать о?